NSTimer pas de tir lors de runloop est bloqué
Je suis presque terminé avec l'une de mes applications et de tests bêta trouvé un bug dans le chronomètre partie...
Le chronomètre utilise un nstimer pour faire le comptage et dispose d'une table pour stocker les tours, mais quand le tour de table est fait défiler la montre s'arrête ou met en pause et ne permet pas de rattraper le temps perdu.
C'était le décrochage a été éliminé en utilisant:
startingTime = [[NSDate date] timeIntervalSince1970];
pour calculer le temps écoulé.
mais je suis toujours à l'aide de la NSTimer pour déclencher toutes les 0,1 secondes et cela signifie que le défilement encore étals de la minuterie, même si le temps écoulé sera mis à jour correctement en fin de compte... et de les comparer à la Pomme chronomètre, il me fait me demander si le chronomètre a un thread séparé juste pour le temps écoulé à compter. Personne ne sait si c'est comment il est fait?
Maintenant, en utilisant le temps depuis l'Époque est bien dans un sens, mais cela complique la question de départ, d'arrêt, & redémarrer le chronomètre
lorsque la montre est arrêtée, l'heure est stockée et utilisée pour calculer un décalage pour quand la montre est redémarré, mais il semble y avoir une certaine latence introduite et le saut de temps à l'avance visiblement lorsque la montre est redémarré.
Toutes les pensées vers la cause de racine ou une solution serait grandement apprécié.
Vous devez vous connecter pour publier un commentaire.
bbum réponse fournit une meilleure façon pour la conception de votre application, mais si vous voulez que votre minuterie pour le feu que l'utilisateur manipule l'INTERFACE utilisateur ou non vous aurez besoin de l'ajouter à la mode de suivi de la runloop.
En supposant que vous êtes en développement pour l'iPhone, ce mode est
UITrackingRunLoopMode
. Si vous êtes en développement pour le Mac, il est nommé de la même manièreNSEventTrackingRunLoopMode
.Si la boucle d'événement n'est pas en cours d'exécution, tous les compteurs ne sera pas le feu jusqu'à ce que la boucle d'événement de pouvez exécuter à nouveau. Même si la boucle d'événement n'est pas bloquer, la minuterie n'est pas garanti à feu exactement son intervalle configuré. Si votre timings étaient entièrement basées sur des minuteries de cuisson, la quantité d'erreur va croître au fil du temps.
Vous avez besoin de garder une trace de la durée séparément à partir de la cuisson de la minuterie. Chaque fois qu'un compte à rebours incendies, de recalculer votre durée et de l'afficher de nouveau.
Pour un départ/pause/redémarrage/arrêt type de configuration, vous devez généralement:
prenez le temps à démarrer (en NSDate instance ou comme un NSTimeInterval valeur)
sur pause ou stop, prenez le temps sur pause/stop. Soustraire l'heure de début à partir de ce moment et vous avez l'intervalle de la durée
lors du redémarrage, prenez le temps lors d'un redémarrage mais aussi de garder autour de la déjà écoulé durée
sur pause/stop, prenez le temps en pause/stop et ajouter à la déjà écoulé durée
En général, faire tout ce avec NSTimeInterval valeurs, qui sont juste des doubles -- est le plus simple. Toutefois, si vous avez besoin de garder une trace de ce moment dans le temps lorsque les événements en cause, l'utilisation NSDate instances de la place.