2009-11-27 16 views
109

¿Alguien sabe si es posible cancelar eventos de selector ya puestos en cola de la pila de eventos o temporizador (o el mecanismo utilizado por la API) cuando llama al performSelector:withObject:afterDelay?cancelando performSelector de cola: llamadas afterDelay

Estaba usando esta pila de eventos para alterar los atributos de una imagen dentro de una pestaña TabBar, y algunas veces pongo en cola hasta 10 segundos en cambios en uno ejecutado rápidamente para bucle ... tal vez 5 milisegundos más o menos.

el problema surge si el usuario cambia las pestañas ... como decir que tengo las alteraciones de imagen en cola para una imagen que se muestra tan pronto como la pestaña 4 está habilitada, y luego el usuario cambia rápidamente a la pestaña 3 y luego volviendo a la Pestaña n. ° 4 ... esto volvería a poner en cola otras alteraciones de 10 segundos mientras la cola anterior aún se estaba reproduciendo, probablemente alrededor de 2 o 3 segundos en la cola si se cambia lo suficientemente rápido ... pero incluso llegando a 5 segundos en la transmisión fue un problema.

así que necesitaba una manera de cancelar la vieja pila de cambios antes de poner una nueva pila en ...

Estoy escribiendo esta consulta en tiempo pasado porque ya ocurrió una solución alternativa a este problema al agregar un filtro de evento de ojos de halcón en la función de reproducción. sin embargo, todavía tengo curiosidad de saber si la cancelación del evento es posible, porque tengo la sensación de que dicho conocimiento será útil en el futuro. gracias por cualquier ayuda prestada :)

+0

¿Cómo podría usar filtro de eventos con ojos de lince en la función de reproducción? –

Respuesta

227
[NSObject cancelPreviousPerformRequestsWithTarget:] 

o

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:] 

El target es el objeto original en el que se llamaba performSelector:afterDelay:.

Por ejemplo:

// schedule the selector 
[self performSelector:@selector(mySel:) withObject:nil afterDelay:5.0]; 
// cancel the above call (and any others on self) 
[NSObject cancelPreviousPerformRequestsWithTarget:self]; 

Ver apple docs, está justo al final de la descripción performSelector:withObject:afterDelay:.

+33

Para obtener alguna aclaración sobre su uso, intente esto: [NSObject cancelPreviousPerformRequestsWithTarget: self]; – dnstevenson

+2

Editado para hacer uso de tu comentario - gracias dnstevenson! – Tim

+0

¡Excelente respuesta! – pmk

1

Compruebe los documentos de NSRunLoop. Desea -cancelPerformSelectorsWithTarget:

2

Si busca "performSelector" para que coincida con "cancelPreviousPerformSelector" ... no es así. (Uf, Apple, ¿por qué haces eso a mí ???)

El, eh, ah, "juego" métodos son: performSelector cancelPreviousPerformRequestsWithTarget

(Sólo para que sea muy difícil de recordar, . sin tener que buscar los documentos)

2

con el fin de realizar cancelar todas las solicitudes anteriores, es posible utilizar:

[NSObject cancelPreviousPerformRequestsWithTarget:self]; 
Cuestiones relacionadas