2012-05-26 9 views
8

Scrollen Ich habe ein NSTimerNSTimer periodische Task nicht genannt bekommt, während

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

die

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

Das Problem macht, ist, dass, während eine Tableview Scrollen (oder andere Aufgaben zu tun), um das Etikett doesn "Bang!" erscheint nicht, also nahm ich an, dass die Methode nicht aufgerufen wird.

Meine Frage ist, wie man das Etikett regelmäßig aktualisiert, auch wenn der Benutzer mit der App-Oberfläche herumspielt.

+0

wird der Code über wirklich alles, was geschieht in regelmäßigen Abständen in 'periodicTimer' gezeigt? Sie müssen nur ein Etikett aktualisieren, das eine Uhrzeit anzeigt? oder gibt es mehr Hintergrundverarbeitung? – Nate

+0

Es passiert alles nur periodisch (NSLog war nur ein Test, um zu sehen, ob die Methode zumindest aufgerufen wird) – Fr4ncis

Antwort

24

Sie müssen Ihren Timer zum UITrackingRunLoopMode hinzufügen, um sicherzustellen, dass Ihr Timer auch während des Scrollens ausgelöst wird.

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

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

+0

Ja, das ist der richtige Weg, um dieses Problem zu lösen. Ich begann mit dem Prototyping meiner Lösungen, bevor das Poster antwortete, dass seine PeriodicTimer-Funktion keine Vereinfachung sei, um die Frage zu stellen, sondern dass er wirklich nichts anderes außer dem Ändern eines Textlabels vorhatte. Also keine Notwendigkeit, Hintergrundarbeit zu verwenden, da das UI-Update alles ist, was es gibt. +1 – Nate

+5

FYI - NSRunLoopCommonModes enthält UITrackRunLoopMode ab iOS 7 –

-2

Nicht sicher über dieses, aber meine erste Vermutung wäre, dass der Hauptfaden, auf dem die Schnittstelle Ihren Timer gerendert wird, gerade keine Chance erhält, irgendetwas während seiner Aktualisierung der Schnittstelle zu tun.

Sie könnten einen neuen Thread mit einer neuen Laufschleife für Ihren Timer erstellen, aber das ist vielleicht eine hässliche Lösung. Welche Funktionen in Ihrer App möchten Sie erreichen? Vielleicht können wir eine bessere Strategie empfehlen, als einen Timer zu verwenden.

+0

Die Funktionalität ist der Timer selbst. Ich denke, es ist ein Problem, dass NSTimer nicht aufgerufen wird, während der Haupt-Thread sich um das Scrollen der Benutzeroberfläche kümmert. – Fr4ncis

Verwandte Themen