Question

I Programmer une minuterie avec la fonction de NSTimer dans viewWillAppear comme suit:

minutesTimer = nil;
minutesTimer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(updateScrollViewItems) userInfo:NULL repeats:YES];

Avec cet appel de fonction, je pense à appeler le sélecteur updateScrollViewItems chaque minute, mais il n'a pas, il mettre à jour des éléments plus rapidement que prévu (environ quelques secondes).

Quelle est la cause de ce comportement inattendu?

Était-ce utile?

La solution

Il pourrait ne pas être la cause directe de la question que vous voyez, mais je peux déjà repérer une erreur majeure.

Le fait que ce compteur est mis en place chaque fois sur viewWillAppear signifie que chaque fois que votre point de vue apparaît, vous créez une nouvelle minuterie (et qui fuit l'ancien) qui se déclenche 60 secondes après la création.

Si votre point de vue disparaît et réapparaît plusieurs fois, vous allez avoir plusieurs minuteries tir tout la même méthode à des intervalles aléatoires complètement.

Vous devez gérer la minuterie correctement. Si vous voulez commencer quand la vue est tout d'abord créé et garder tic-tac / mise à feu, même si la vue n'apparaît pas, vous devez créer pendant init ou viewDidLoad, puis assurez-vous de l'arrêter quand vous dealloc ou viewDidUnload.

Si vous voulez que votre minuterie pour ne cocher / feu lorsque la vue est la vue actuelle, vous devez vous assurer que vous gérez l'arrêt et le démarrage de la minuterie appropriée sur viewDidAppear et viewWillDisappear.

En outre, comme Williham Totland dit dans sa réponse, NSTimer ne doit pas être invoqué pour le moment exact. Ceci est également indiqué dans la documentation:

  

Une minuterie est pas un mécanisme en temps réel; il se déclenche que lorsque la minuterie à laquelle a été ajoutée est en cours d'exécution et en mesure de vérifier si le temps de mise à feu de la minuterie a réussi l'un des modes de boucle d'exécution. En raison des différentes sources d'entrée d'une boucle d'exécution typique assure la gestion, la résolution effective de l'intervalle de temps pour une minuterie est limitée à l'ordre de 50-100 millisecondes. Si se produit alors que la boucle d'exécution est en mode temps de mise à feu d'une minuterie qui ne surveille pas la minuterie ou pendant une longue callout, la minuterie ne se déclenche pas jusqu'à ce que la prochaine fois que la boucle d'exécution vérifie la minuterie. Par conséquent, le temps réel auquel peut potentiellement les feux de minuterie une période de temps significative après le temps de mise à feu prévue.

Dans ce cas, un laps de temps de 60 secondes, il ne devrait pas être un problème que la minuterie n'est pas exact, je pense que les questions que vous voyez sont parce que la minuterie n'est pas géré correctement.

Autres conseils

L'iPhone est beaucoup de choses; et un dispositif propre, cependant; comme tout autre ordinateur, une pièce d'horlogerie de précision, il est pas. Cependant, il semble que si la méthode en question prend une NSTimeInterval, qui est un double. Vous pouvez changer cela à 60.0.

  

Si vous voulez que votre minuterie seulement   tick / feu lorsque la vue est le courant   vue, alors vous devez vous assurer que vous êtes   la gestion de l'arrêt et le démarrage de la   minuterie appropriée sur viewDidAppear   et viewWillDisappear.

Merci pour cette information, même si je ne suis pas l'OP de ce fil que je cherchais une réponse à un problème similaire. Je grattais ma tête pendant quelques jours, cherchai sur Internet mais je ne pouvais pas trouver la réponse. Enfin, j'ai trouvé ce fil. Ceci est une information précieuse pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top