objective-c selector

objective c - cancelar el selector de rendimiento en cola: llamadas afterDelay



objective-c (4)

¿Alguien sabe si es posible cancelar los eventos del selector ya en cola de la pila de eventos o del temporizador (o el mecanismo que utiliza la API) cuando se llama a performSelector:withObject:afterDelay ?

Estaba usando esta pila de eventos para alterar los atributos de una imagen dentro de una pestaña de TabBar, y algunas veces pongo en cola hasta 10 segundos de cambios en uno ejecutado rápidamente para el ciclo ... 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 n. ° 3 y luego vuelve a la pestaña # 4 ... esto luego 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 corriente fue un problema.

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

Estoy escribiendo esta consulta en tiempo pasado porque ya se me 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 asistencia prestada :)


Para cancelar todas las solicitudes de ejecución anteriores, puede usar:

[NSObject cancelPreviousPerformRequestsWithTarget:self];


Si está buscando "performSelector" para que coincida con "cancelPreviousPerformSelector" ... no es así. (Ugh, Apple, ¿por qué me haces eso?)

Los métodos "matching" er, ah, ah son: performSelector cancelPreviousPerformRequestsWithTarget

(Solo para que sea más difícil de recordar, sin buscar en los documentos).


Verifique los documentos de NSRunLoop. Desea -cancelPerformSelectorsWithTarget:


[NSObject cancelPreviousPerformRequestsWithTarget:]

o

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

El target es el objeto original en el que se 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 performSelector:withObject:afterDelay: description.