2012-06-28 11 views
12

Estoy tratando de hacer que mi aplicación realice una acción después de un retraso, pero tendrá que hacerse MIENTRAS el usuario está interactuando con/.iOS: realizar una acción tras otra mientras el usuario está interactuando/desplazándose

No estoy seguro de por qué ni performSelector:withObject:afterDelay ni scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: se dispararán. ¿Es porque están en un hilo de fondo?

¿Alguna sugerencia o ayuda?

+0

Lo que no está trabajando con performSelector: afterDelay :? ¿Qué es lo que estás tratando de hacer? ¿Estás SEGURO de que no disparan, es decir, si pones una declaración NSLog para verificar? –

+0

He puesto una declaración de registro. Se dispara después de que el usuario deja de interactuar con la pantalla. Estoy tratando de actualizar una etiqueta. – RileyE

+0

He encontrado esto: http://stackoverflow.com/questions/2865760/performselectorwithobjectafterdelay-not-working-from-scrollviewdidzoom, pero no hay ninguna manera de incorporar un retraso con eso. – RileyE

Respuesta

23

Ambos NSTimer y performSelector:withObject:afterDelay: de forma predeterminada solo se activan en el modo de ciclo de ejecución normal. Cuando se desplaza, el ciclo de ejecución está en modo de seguimiento de eventos.

Usted tiene que programar su acción sincronizada en todos los modos comunes:

NSTimer *timer = [NSTimer timerWithTimeInterval:0.016 target:self selector:@selector(fire:) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

o

[self performSelector:@selector(fire:) withObject:nil afterDelay:1.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]]; 

También está el dedicado NSEventTrackingRunLoopMode.

+0

Entonces, ¿es como lo que tengo en el comentario? – RileyE

+0

@RileyE No estoy seguro de entender lo que quieres decir. ¿Cuál comentario? –

+0

Lo siento. ¡Estoy siendo muy vago! El comentario donde menciono una publicación que estaba viendo antes. La publicación es: http://stackoverflow.com/questions/2865760/performselectorwithobjectafterdelay-not-working-from-scrollviewdidzoom – RileyE

4

Asegúrese de que el disparador retrasado ocurra en el NSRunLoopCommonModes. El valor predeterminado es NSDefaultRunLoopMode, que no recibirá mensajes mientras, p. desplazándose.

[self performSelector:@selector(fire:) withObject:nil afterDelay:2.0 inModes:@[NSRunLoopCommonModes]]; 

Alternativamente, puede utilizar GCD que también se comporta de la misma manera (no está seguro de qué modo runloop se utiliza)

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    <#code to be executed on the main queue after delay#> 
}); 
0

para SWIFT:

performSelector(#selector(fire:), withObject: sender, afterDelay: 1.0, inModes: [NSRunLoopCommonModes]) 
Cuestiones relacionadas