web-dev-qa-db-fra.com

Différence dans la planification de NSTimer dans le thread principal et le thread d'arrière-plan?

Quand j'appelle scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: sur le thread principal et définissez l'intervalle de temps sur 5 secondes, le code ci-dessous est exécuté et après 5 secondes, le sélecteur de minuterie est appelé.

Mais si j'essaye même dans un fil d'arrière-plan, le code ci-dessous scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: ne sera pas exécuté, il attendra que la minuterie se déclenche puis s'exécute. Bien sûr, afin d'exécuter la minuterie dans le thread d'arrière-plan, j'ai d'abord obtenu une instance de NSRunLoop et je l'ai exécutée.

Existe-t-il un moyen de définir le minuteur dans le thread d'arrière-plan et de le rendre non bloquant, donc le code après son exécution immédiate?

39
MegaManX

NSTimer nécessite une boucle d'exécution active, lorsqu'il est initialisé dans le thread principal, il utilise automatiquement la boucle d'exécution principale. Si vous devez créer un temporisateur d'arrière-plan, vous devez l'attacher à la boucle d'exécution du thread et appeler run () pour le rendre actif.

  1. NSTimer a besoin d'un live NSRunLoop pour exécuter ses événements. Dans le thread principal, le NSRunLoop est toujours actif et ne s'arrêtera jamais jusqu'à la fin de l'application, mais dans les autres threads, vous devez invoquer run () pour activer le NSRunLoop .

  2. NSTimer doit invoquer invalidate () pour libérer le minuteur actuel, sinon, le temporisateur conservera une référence forte de l'instance actuelle de la cible, et il restera en mémoire jusqu'à ce que invalidate () soit invoqué ou que l'application se termine;

  3. NSTimer doit être créé et invalidé dans le même thread, et bien des fois, nous pouvons l'oublier.

Jetez un œil à cet exemple, il peut être utile >> http://www.acttos.org/2016/08/NSTimer-and-GCD-Timer-in-iOS/ et la documentation: https://developer.Apple.com/documentation/foundation/nstimer

6
Diksha235