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.
Vous voulez dire que vous continuez à courir quand l'application est en arrière-plan – Xcode
@userXXX Si l'application n'est pas détruite, alors SAUVEGARDEZ-la - mais pourquoi ne l'essayez-vous pas? –
sûr que je suis l'essayer – Xcode