Continuez à utiliser NSTimer en changeant l'arrière-plan et le premier plan

J'essaye de créer un NSTimer qui est démarré manuellement par l'user au premier plan, et comme prévu fonctionne parfaitement:

timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateCounter"), userInfo: nil, repeats: true) 

updateCounter() met simplement à jour un UILabel dans l'interface user. Maintenant, ce que je veux réaliser, c'est de le faire tourner aussi quand l'user quitte l'application. J'ai googlé quelque chose et trouvé ce code (que j'ai traduit dans Swift):

 func applicationDidEnterBackground(application: UIApplication) { var bgTask = UIBackgroundTaskIdentifier() bgTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { () -> Void in UIApplication.sharedApplication().endBackgroundTask(bgTask) } // Start the long-running task and return immediately. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in var vc = TimerViewController() // Fire some methods UIApplication.sharedApplication().endBackgroundTask(bgTask) bgTask = UIBackgroundTaskInvalid }); } 

Fondamentalement, ce que je peux comprendre ici, c'est que lorsque l'application atteint l'arrière-plan, je peux triggersr certaines methods à partir d'une nouvelle instance de mon TimerViewController() , qui est censé gérer le NSTimer pour la phase d'arrière-plan.

Cela implique-t-il que j'ai besoin d'utiliser une méthode de ce vc, ou autre, qui démarre un autre NSTimer partir de l'heure exacte à laquelle le premier plan a été arrêté (parce que l'application est input en arrière-plan)?

Si oui, pour reprendre mon premier NSTimer lorsque l'user ouvre à nouveau l'application (ce qui signifie au premier plan: D) comment dois-je me comporter? Arrêtez le second NSTimer et reprenez le premier avec un countur mis à jour?

En fait même un croquis de la solution est apprécié, j'essaie juste de comprendre comment gérer la situation.

autre question : Si ce qui est écrit ci-dessus s'avère correct comment puis-je gérer les instances du viewcontroller pour get la valeur timer_value (jeton pour quelque chose comme secondsLeft ) quand un changement de fond à l'avant-plan ou vice-versa?

Au lieu d'essayer de maintenir un NSTimer en arrière-plan (ce qui est impossible au-delà d'environ 10 minutes), ce que vous voulez faire est d'save quand votre temporisateur a commencé et enregistrez-le dans NSUserDefaults . Vous pouvez toujours mettre à jour votre minuteur toutes les secondes, mais juste recalculer l'label en fonction de l'heure de début (souvenez-vous, NSTimer ne promet pas qu'il fonctionnera à time, il pourrait être en retard pour de nombreuses raisons et vous dériver).

Maintenant, il n'y a aucune raison de courir en arrière-plan. Lorsque votre controller de vue apparaît à l'écran ( viewDidAppear: , il suffit de mettre à jour l'label, en fonction de l'heure de début enregistrée dans NSUserDefaults .

IOS ne peut pas fonctionner indéfiniment en arrière-plan. C'est par design. Mais il n'y a pas non plus de raison pour que vous gaspilliez des ressources système en essayant de mettre à jour votre interface user lorsque vous n'êtes pas à l'écran. Juste le mettre à jour quand vous êtes.