2012-05-26 13 views
8

Ho un NSTimerNSTimer task periodico non viene chiamato durante lo scorrimento

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

che fa

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

Il problema è che durante lo scorrimento di un Tableview (o fare altre attività) l'etichetta doesn essere aggiornato, inoltre, "Bang!" non appare, quindi supposi che il metodo non venga chiamato.

La mia domanda è come aggiornare periodicamente l'etichetta anche quando l'utente sta giocando con l'interfaccia dell'app.

+0

è il codice mostrato in 'periodicTimer' sopra veramente tutto ciò che accade periodicamente? hai solo bisogno di aggiornare un'etichetta che mostra un'ora? o c'è più elaborazione in background? – Nate

+0

È tutto ciò che accade periodicamente (NSLog era solo un test per vedere se almeno il metodo viene chiamato) – Fr4ncis

risposta

24

È necessario aggiungere il timer alla UITrackingRunLoopMode per assicurarsi che il timer scatti anche durante lo scorrimento.

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

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

+0

Sì, questo è il modo giusto per gestire questo problema. Ho iniziato a prototipare le mie soluzioni prima che il poster rispondesse che la sua funzione PeriodicTimer non era una semplificazione per il solo scopo di porre la domanda, ma che in realtà non aveva nulla in corso oltre a cambiare un'etichetta di testo. Quindi, non è necessario utilizzare il lavoro in background in quanto l'aggiornamento dell'interfaccia utente è tutto ciò che c'è. +1 – Nate

+5

FYI - NSRunLoopCommonModes include UITrackRunLoopMode come da iOS 7 –

-2

Non sono sicuro di questo, ma la mia prima ipotesi sarebbe che il thread principale su cui viene eseguito il rendering dell'interfaccia del timer non abbia la possibilità di fare nulla mentre sta aggiornando l'interfaccia.

È possibile creare un nuovo thread con un nuovo ciclo di esecuzione per il timer, ma forse è una soluzione un po 'brutta. Quali funzionalità della tua app stai cercando di raggiungere? Forse possiamo consigliare una strategia migliore rispetto all'utilizzo di un timer.

+0

La funzionalità è il timer stesso. Penso che sia un problema nel non chiamare NSTimer mentre il thread principale si sta occupando dello scorrimento dell'interfaccia utente. – Fr4ncis

Problemi correlati