2013-05-31 3 views
1

ici Code:Après la fermeture de la course application NSTimer ou non

timer1 = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(getLastImageName) userInfo:nil repeats:YES]; 
runLoop = [NSRunLoop currentRunLoop]; 
[runLoop addTimer:timer1 forMode:NSRunLoopCommonModes]; 
[runLoop run]; 

Cette minuterie se déclenche une alerte lorsque l'utilisateur appuie sur la mauvaise option. Au clic de l'alerte OK bouton J'arrête la minuterie et runloop. Si l'utilisateur ne clique pas sur le bouton OK et appuie à la place sur le bouton d'accueil de l'iPhone, la minuterie sera-t-elle arrêtée?

+0

Vous voulez dire que vous continuez à courir quand l'application est en arrière-plan – Xcode

+0

@userXXX Si l'application n'est pas détruite, alors SAUVEGARDEZ-la - mais pourquoi ne l'essayez-vous pas? –

+0

sûr que je suis l'essayer – Xcode

Répondre

0

Votre application est-elle exécutée en arrière-plan ou suspendue en arrière-plan?

Si vous n'avez pas ajouté de mode multitâche à votre info.plist, votre application sera suspendue. La minuterie sera mise en pause jusqu'à ce que l'utilisateur reprenne votre application.

Si vous avez ajouté un mode multitâche et que vous remplissez les conditions requises (par exemple, le mode audio et que vous jouez actuellement de l'audio), votre application sera toujours en cours d'exécution, y compris sa minuterie.

+0

comment vérifier l'application en mode multitâche? – Xcode

+0

application est en cours d'exécution en arrière-plan – Xcode

+0

Comment courez-vous en arrière-plan? Utilisez-vous 'UIBackgroundModes' dans votre' Info.plist', ou appelez-vous 'beginBackgroundTaskWithExpirationHandler:' quelque part? –

4

Les temporisateurs ne fonctionnent pas comme vous le pensez. Il n'y a pas de "compte à rebours". Une minuterie ajoute simplement un marqueur à une boucle d'exécution pour envoyer un certain message à un certain moment. Chaque fois que le runloop s'exécute, il vérifie si l'un des temporisateurs a expiré (si "now" est postérieur à sa date d'incendie). Si c'est le cas, il envoie le message demandé de la même manière que d'autres choses comme appeler drawRect: ou traiter un événement tactile ou similaire. C'est plus ou moins une boucle géante while (true) où l'une des choses dans la boucle est "minuteries de feu expiré".

Alors qu'est-ce que tout cela signifie? Cela signifie que les minuteurs ne se déclencheront que lorsque le runloop donné sera "pompé" (traité). Habituellement, il s'agit de la boucle de démarrage principale, et elle n'est traitée que lorsque votre application est active. Si vous devenez inactif (généralement lorsque l'utilisateur accède à une autre application), la boucle de démarrage ne sera pas traitée. Toutes les minuteries qui expirent pendant que vous êtes inactif se déclenchent lorsque vous revenez (c'est pourquoi vous voulez généralement invalider les minuteries avant de passer en arrière-plan). (Les runloops non principaux sont un peu plus compliqués, mais assez rares, mais ils ne fonctionneront pas indéfiniment en arrière-plan, mais il y a plus de cas où ils ne fonctionnent pas.)

D'autre part, si vous êtes terminé (ce qui peut se produire sans avertissement pendant que vous êtes en arrière-plan), alors vos runloops sont tous partis. Lorsque vous relancez, vos minuteurs ne seront pas instanciés. C'est ton travail si tu le veux. Vous ne pouvez donc pas compter sur le fait que vos minuteurs sont en train de se déclencher.

Étant donné que vous avez inclus repeats:YES, la minuterie sera replanifiée automatiquement pour vous. Encore une fois, cela ne signifie pas qu'il "compte à rebours" ou qu'il "fonctionne encore" ou quelque chose comme ça. Cela signifie simplement que lorsqu'il se déclenche, il planifie automatiquement un autre événement de minuterie. Donc, si l'utilisateur reste juste assez longtemps sur le bouton "OK", la minuterie se déclenchera de nouveau (dans iOS, les choses peuvent être un peu différentes sur Mac et les "modes" comptent plus).

Notez qu'il n'y a aucune raison d'appeler à la fois scheduledTimerWithTimeInterval:... et addTimer:... La partie "planifiée" de la méthode signifie que la temporisation a déjà été ajoutée à la boucle de démarrage.

Questions connexes