Unterschied in der Zeitplanung NSTimer in den Haupt-thread und hintergrund-thread?
Wenn ich rufe scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
auf dem Haupt-thread und Zeit-Intervall auf 5 Sekunden code unten ein timer ausgeführt wird und nach 5 Sekunden timer-Selektor aufgerufen wird.
Aber wenn ich versuche, gleichzeitig in einigen hintergrund-thread den code unten scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
ist, nicht ausgeführt wird, wird es warten, bis der timer um das Feuer und dann wird Sie ausgeführt. Natürlich, um den timer im hintergrund-thread, habe ich zum ersten mal eine Instanz der NSRunLoop
und führen Sie es.
Gibt es eine Möglichkeit, die timer im hintergrund-thread und machen es non-blocking, also code nach, es wird sofort ausgeführt?
- Es wird empfohlen, die von apple, dass NSTimer in den Haupt-thread. In der hintergrund-thread Zeit genommen, um das Feuer NSTimer möglicherweise länger als erwartet. NSTimer ist non-blocking standardmäßig. Es Stoppt nicht die Ausführung der Linien geschrieben, nachdem es.
- können Sie bitte teilen Sie die entsprechende apple-doc-link.
- tut NSTimer laufen zu bekommen in dem Haupt-thread standardmäßig oder jede NSTimer bekommt einen neuen thread ?
- Es ist etwas, wie Jedes mal, wenn Sie starten Sie Ihre app auf iOS, das system erstellt einen Thread der Haupt-thread. Jeder Thread hat eine RunLoop automatisch für Sie erstellt, wie gebraucht.Derzeit wird jeder Timer feuert auf den roten Faden und ist an eine RunLoop.
Du musst angemeldet sein, um einen Kommentar abzugeben.
NSTimer erfordert einen aktiven run-Schleife, wenn die Initialisierung im Main-Thread es verwendet automatisch die main-Schleife laufen. Wenn Sie brauchen, um einen hintergrund-timer müssen Sie es anbringen, um die Gewinde laufen-Schleife und ruft run() um es aktiv zu machen.
NSTimer muss man Leben, NSRunLoop, um Sie auszuführen Ereignisse. Im Haupt-thread, der NSRunLoop ist immer live und wird nie aufhören, bis die app beendet wird, aber in anderen threads, die Sie aufrufen müssen run (), um aktiv die NSRunLoop.
NSTimer aufrufen müssen invalidate() zu release der aktuellen timer, da sonst der timer wird weiterhin eine starke Referenz auf die aktuelle Instanz der Ziel, und es wird in Erinnerung bleiben, bis invalidate() aufgerufen oder eine app beendet;
NSTimer muss erstellt und für ungültig erklärt, die in dem gleichen thread, und eine Menge Zeit, können wir vergessen.
Werfen Sie einen Blick auf dieses Beispiel , kann es hilfreich sein, >> http://www.acttos.org/2016/08/NSTimer-and-GCD-Timer-in-iOS/
und die Dokumentation : https://developer.apple.com/documentation/foundation/nstimer