2012-05-26 16 views
8

Tengo una NSTimerNSTimer tarea periódica no se consiga llamar mientras se desplaza

timer = [NSTimer scheduledTimerWithTimeInterval:1 
             target:self 
             selector:@selector(periodicTimer) 
             userInfo:nil 
             repeats:YES]; 

cual hace

- (void)periodicTimer 
{ 
    NSLog(@"Bang!"); 
    if (timerStart != nil) 
     [timerLabel setText:[[NSDate date] timeDifference:timerStart]];   
} 

El problema es que mientras se desplaza un tableview (o haciendo otras tareas) la etiqueta doesn no se actualiza, además, "Bang!" no aparece, así que supongo que el método no se llama.

Mi pregunta es cómo actualizar periódicamente la etiqueta incluso cuando el usuario está jugando con la interfaz de aplicación.

+0

es el código que se muestra en 'periodicTimer' anteriores realmente todo lo que sucede periódicamente? solo necesita actualizar una etiqueta que muestre una hora? o hay más procesamiento de fondo involucrado? – Nate

+0

Es todo lo que sucede periódicamente (NSLog era sólo una prueba para ver si el método es llamado por lo menos) – Fr4ncis

Respuesta

24

Tendrá que añadir su temporizador a la UITrackingRunLoopMode para asegurarse de que su contador de tiempo también se dispara durante el desplazamiento.

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

Desde: https://stackoverflow.com/a/1997018/474896

+0

Sí, esta es la forma correcta de manejar este problema. Comencé a crear prototipos de mis soluciones antes de que el póster respondiera que su función periódica del temporizador no era una simplificación para hacer la pregunta, sino que realmente no tenía nada más que cambiar una etiqueta de texto. Por lo tanto, no es necesario utilizar el trabajo en segundo plano, ya que la actualización de la interfaz de usuario es todo lo que hay. +1 – Nate

+5

FYI - NSRunLoopCommonModes incluye UITrackRunLoopMode a partir de iOS 7 –

-2

No está seguro acerca de esto, pero mi primera conjetura sería que el hilo principal sobre el que se está representando la interfaz de su contador de tiempo simplemente no tienen la oportunidad de hacer nada mientras que su actualización de la interfaz.

Se puede crear un nuevo hilo con un nuevo bucle de ejecución para su contador de tiempo, pero eso es un poco de una solución fea tal vez. ¿Qué funcionalidad en su aplicación está tratando de lograr? Tal vez podamos aconsejar una mejor estrategia que usar un temporizador.

+0

La funcionalidad es la misma temporizador. Creo que es un problema que NSTimer no se llame mientras el hilo principal se ocupa del desplazamiento de la IU. – Fr4ncis

Cuestiones relacionadas