cancelar llamadas performSelector: afterDelay en cola

115

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

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

el problema surge si el usuario cambia de pestaña ... como por ejemplo, tengo las alteraciones de imagen en cola para una imagen que se muestra tan pronto como se habilita la pestaña # 4, y luego el usuario cambia rápidamente a la pestaña # 3 y luego vuelve a la pestaña # 4 ... esto luego volvería a poner en cola otros 10 segundos de alteraciones 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 los 5 segundos en la corriente era un problema.

así que necesitaba alguna forma de cancelar la antigua 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 agregando un filtro de eventos de ojos de halcón en la función de reproducción. sin embargo, todavía tengo curiosidad por saber si es posible cancelar el evento, porque tengo la sensación de que ese conocimiento será útil en el futuro. gracias por cualquier ayuda prestada :)

eerok512
fuente
¿Cómo podría utilizar el filtro de eventos de ojos de halcón en la función de reproducción?
Maniganda saravanan

Respuestas:

241
[NSObject cancelPreviousPerformRequestsWithTarget:]

o

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

El targetes el objeto original en el que performSelector:afterDelay:se llamó.

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];

Consulte los documentos de Apple , está justo al final de la performSelector:withObject:afterDelay:descripción.

StefanB
fuente
33
Para alguna aclaración sobre su uso, intente esto: [NSObject cancelPreviousPerformRequestsWithTarget: self];
dnstevenson
[NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector (mySel :) object: nil];
webtrick101
2

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

[NSObject cancelPreviousPerformRequestsWithTarget:self];   
Marco Mirisola
fuente
2

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

Los, er, ah, los métodos de "coincidencia" son:

performSelector

cancelPreviousPerformRequestsWithTarget

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

Irene
fuente
1

Consulte la documentación de NSRunLoop. Usted quiere-cancelPerformSelectorsWithTarget:

NSResponder
fuente