J'ai un Par exemple, si j'augmente la valeur et la minuterie incendie dans 1 seconde, je veux changer cela et rendre le feu de la minuterie en 3 secondes à la place. Puis-je invalider la minuterie et la créer à nouveau? Ou puis-je le faire avec NSTIMER code> qui déclenche avec un intervalle de 3 secondes pour diminuer une valeur. Lorsque je fais une action qui augmente cette valeur, je souhaite redémarrer la minuterie pour compter 3 secondes à partir de ce point. P>
sefiredate: code> à l'aide de la date actuelle et ajout d'un intervalle de 3 secondes? P>
5 Réponses :
Oui, vous pouvez l'invalider. Et le créer à nouveau.
Vous pouvez également utiliser: p> Vous appelez mytimedTask pour lancer la tâche récurrente. Une fois qu'il est démarré, vous pouvez modifier le retard avec VaryingDelay ou l'arrêter avec Westillwanttimer. P> P>
@zoul, dépend de la manière dont vous voulez être désordonné :-)
Invallamez la minuterie et recréez-la. Cependant, assurez-vous de ne pas invalider et em> libérer la minuterie, sauf si vous n'êtes pas sûr de vous en avoir besoin depuis que la boucle d'exécution conserve les minuteries jusqu'à ce qu'elles soient invalidées et les libèrent ensuite. p>
À mon avis, le code de la formidiste avec le code de minuterie conduit à une exécution multiple des méthodes cible, donc je resterais loin de cela. P>
Oui, invalidez et recréant la minuterie fonctionnera. C'est essentiellement ce que vous souhaitez faire si vous n'évaluez pas votre valeur: réinitialiser et recommencer. P>
Le setfairedate: code>
Docs mention que changer la date d'incendie est relativement coûteuse, suggérant qu'il pourrait être préférable de détruire et de recréer la minuterie à moins que vous ne le faisiez Donc beaucoup em>. Par souci d'argument, cependant, j'ai fouetté cette catégorie il y a un peu de temps. Je préfère cela parce qu'il encapsule le comportement d'ajustement de la date; La minuterie elle-même le gère, plutôt que son propriétaire / contrôleur. Je n'ai aucune donnée de performance à ce sujet, cependant. @implementation NSTimer (WSSAdjustingFireDate)
- (void)WSSFireAdjustingFireDate
{
[self fire];
[self WSSSkipNextFireAdjustingFireDate];
}
- (void)WSSSkipNextFireAdjustingFireDate
{
CFRunLoopTimerRef cfSelf = (__bridge CFRunLoopTimerRef)self;
CFTimeInterval delay = CFRunLoopTimerGetInterval(cfSelf);
CFRunLoopTimerSetNextFireDate(cfSelf, CFAbsoluteTimeGetCurrent() + delay);
}
@end
J'ai fait un petit test, et il s'avère que la réinitialisation du pompier est environ quatre fois plus rapide que l'invalidation et la ré-création de la minuterie. Premièrement, je crée une minuterie qui appelle la méthode donothing: voici le code de test: p> exécuté sur un iPad Air Rendements 0.198173 s pour invalidez et 0.044207 S pour RESETDTIMER. Si la performance est votre cible, je recommande de réinitialiser le tickedate. C'est aussi un effort assez moins codant. P> P>
Enfin, j'utilise SetfirewithDate, lorsque j'augmente la valeur, j'envoie également un message à la minuterie avec la date actuelle plus trois secondes. Ça marche ^^ Merci beaucoup du tout.