2011-10-05 12 views
7

En mi aplicación para el iPhone que tiene varios lugares donde puedo hacer una llamadaCómo verificar si hay un selector de rendimiento: ¿esperando a ser ejecutado?

[object performSelector: withObject: afterDelay:]

. Todos conducen al mismo método. Ahora, en ese método, quiero ejecutar algún código solo en la última llamada de este. Si fue el primero, podría simplemente hacer [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(thisMethod) object:nil] y me aseguro de que se llame una vez.

Pero, ¿hay alguna manera de saber si hay otras llamadas al método esperando a ejecutarse?

Podría usar un contador de esta clase que aumentaría cada vez que configuré este parámetro después de la demora, luego lo disminuiría al inicio de cada llamada y solo ejecutaría el código si este contador se pone a cero. Pero me pregunto si es el enfoque mejor/aceptable ...

Respuesta

6

Bueno, lo que podría hacer es esto: cada vez que llame al [object performSelector: withObject: afterDelay:] simplemente agregue la línea que mencionó anteriormente. En realidad, podría crear un método que maneje eso por usted. Por ejemplo:

- (void)performSelectorOnce:(SEL)selector withObject:(id)object afterDelay:(NSTimeInterval)delay 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:object selector:selector object:object]; 
    [self performSelector:selector withObject:object afterDelay:delay]; 
} 

y que donde quiera que utiliza [object performSelector: withObject: afterDelay:] simplemente reemplazarlo con [auto performSelectorOnce: withObject: afterDelay:];

Si desea utilizar esto en varios objetos de lo que realmente podría crear una categoría NSObject y agregar el método allí.

Vamos a saber si esto funciona para usted.

+0

¿Qué sucede si solo desea ignorar las llamadas sucesivas sin modificar la primera programada? Por ejemplo, llamadas para actualizar una vista de tabla. – Rivera

Cuestiones relacionadas