Comment exécuter la timer pensé que l'application est entré en arrière-plan ou est terminée

Dans mon application, j'ai un NSTimer, et un sélecteur - (void)TimerCount . J'ai aussi un integer int CountNum , et toutes les 0.01 seconde, il augmente de 1 ( CountNum = CountNum + 1 ).

 Timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(TimerCount) userInfo:nil repeats:YES]; 

Et je veux que la timer reprenne la pensée que l'application est terminée ou est input en arrière-plan. Comment puis-je faire ceci?

Si votre application est terminée , vous ne pourrez pas continuer le traitement. Pour fonctionner en arrière-plan, il y a des tâches en arrière-plan, mais il semble que votre cas d'utilisation ne les justifie pas. Comme votre incrémentation est linéaire et calculable, vous pouvez affecter votre date de début à NSUserDefaults , puis la recharger lorsque votre application reprendra et mettre à jour votre count.

 [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithDouble:[[NSDate date] timeIntervalSince1970]] forKey:@"start_time"]; NSNumber *start = [[NSUserDefaults standardUserDefaults] objectForKey:@"start_time"]; countNum = ceil([[NSDate date] timeIntervalSince1970] * 100) - ceil([start doubleValue] * 100); 

Quelques pensées:

  1. Généralement, vous n'essaieriez pas de laisser la timer en marche. Vous devriez éviter que l'application ne fasse quoi que ce soit en arrière-plan si vous n'en avez pas besoin. Vous videz inutilement les ressources système de l'user (batterie, memory, cycles du processeur, etc.).

  2. Si vous avez besoin d'attirer l'attention de l'user à un moment ultérieur lorsque l'application risque de ne pas fonctionner (par exemple, s'il s'agit d'une fonction de type count à rebours ou alarme), utilisez la notification d'location plutôt que d'utiliser la timer .

  3. En outre, si vous essayez de garder une trace du time qui s'est écoulé, l'utilisation de NSTimer n'est pas la bonne solution (surtout si vous la triggersz 100 fois par seconde). Capturez l'heure de début et ensuite quand vous voulez identifier combien de time s'est écoulé, puis à tout moment futur, vous pouvez saisir l'heure actuelle et la comparer à l'heure de début.

    La beauté de cette approche est que vous ne vous souciez plus de la fréquence à laquelle vous faites ce process. Si vous mettez à jour l'interface user, vous pouvez l'appeler 60 fois par seconde. Si l'application est en arrière-plan, vous n'avez rien à faire tant que l'application n'est pas remise au premier plan (enregistrez simplement l'heure de début dans un stockage persistant, tel que NSUserDefaults , puis récupérez-la à nouveau lorsque l'application redémarre) .

    Bottom line, en s'éloignant de l'approche «countur» à une approche «comparer l'heure actuelle à l'heure de début», vous déconnectez l'interface user de la timer. Inutile de dire que, une fois que vous avez fait cela, vous n'avez pas besoin de la timer du tout lorsque l'application quitte le premier plan.

Si vous avez absolument besoin de la timer pour exécuter quand l'application quitte le premier plan, il existe des moyens de le faire (par exemple, requestr quelques minutes pour terminer une tâche de longueur finie), mais seulement si vous en avez absolument besoin. Si vous ne faites que mettre à jour un countur, vous ne voulez certainement pas le faire.

Vous pouvez utiliser NSuserdefaults pour save votre countNum, chaque fois que l'user quittera l'application, il sera sauvegardé. Appelez simplement ceci dans la fonction APPDELEGATE - (void)applicationWillTerminate:(UIApplication *)application {

 NSUserDefault *defaults = [NSUser Defaults standardUserDefaults]; [defaults setInteger: countNum forKeys:@"ANY_KEY_HERE"]; [defaults synchronise]; 

Le code ci-dessus va save votre numCompte, mais vous devez l'save lorsque l'user se terminera ou passera en arrière-plan.

Et quand l'user viendra au premier plan, vous pouvez appeler pour récupérer votre countNum

 NSUserDefault *defaults = [NSUser Defaults standardUserDefaults]; yourCountNum = [default getIntegerForKeys: @"ANY_KEY_HERE"];