Arrêter une NSRunLoop à partir d'une minuterie
J'ai fait un RunLoop avec une minuterie qui met à jour un label qui affiche un compte à rebours. J'ai besoin de la RunLoop de s'arrêter une fois le compte à rebours atteint zéro, pour le cas où le timer termine normalement je pourrais simplement utiliser runUntilDate, avec la date étant la date du jour + le temps du compte à rebours. Le problème, c'est lorsque l'utilisateur annule le compte à rebours à partir d'un bouton avant qu'il est fini. Je ne sais pas comment le dire à la RunLoop à arrêter le bouton annuler l'action. Voici le code pour le RunLoop:
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
[self methodSignatureForSelector:@selector(updateCountdownLabel:)]];
[invocation setTarget:self];
[invocation setSelector:@selector(updateCountdownLabel:)];
[[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:1 invocation:invocation repeats:YES] forMode:NSRunLoopCommonModes];
La méthode dit juste l'étiquette de réduire de 1 à chaque tour de boucle.
Je pourrais dire sur le bouton annuler pour modifier l'étiquette à zéro, et d'avoir de l'exécution de la boucle sélecteur de vérifier si la valeur est zéro, mais le RunLoop propre sélecteur de dire stop?
cancelPerformSelector:target:argument:
cancelPerformSelectorsWithTarget:
Ces sont le plus proche que j'ai trouvé, mais ils ne semblent pas fonctionner de l'intérieur de la RunLoops propre sélecteur, ou au moins pas, de toute façon j'ai essayé.
Essentiellement, j'ai besoin d'avoir le bouton de dire la RunLoop à l'arrêt, ou en quelque sorte arrêt de la RunLoop de son propre sélecteur.
Grâce.
OriginalL'auteur Elbimio | 2011-07-08
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas fait une course en boucle, vous avez prévu une minuterie pour commencer sur la course principale de la boucle.
Ce que vous devez faire est de stocker les
NSTimer
objet que vous créez comme une variable d'instance avant de programmer la minuterie sur l'exécution de la boucle.Dans votre
updateCountdownLabel:
méthode, une fois la fin de votre condition a été satisfaite appelez simplement-invalidate
sur votre occurrence de timer. Cela permettra d'éliminer la minuterie de l'exécution de la boucle, et parce que vous n'avez jamais conservé, il sera libéré.J'ai mis à jour les méthodes à utiliser un sélecteur à base de
NSTimer
plutôt que votreNSInvocation
. Cela signifie que la méthode de rappel de signature est définie comme vous vous attendez. Il évite également la nécessité de stocker lesNSTimer
objet dans un ivar:J'ai mis à jour le code pour utiliser un sélecteur à base de
NSTimer
, qui devrait vous donner le résultat que vous souhaitez.Trouvé le problème. J'ai juste besoin d'une variable pour enregistrer le numéro sur l'étiquette comme un int et utilisez-la dans le si. Merci!
Cela fonctionne uniquement quand il incendies "updateCountdownLabel" la première fois et que vous appelez immédiatement invalider sur la minuterie. Si il a tiré "updateCountdownLabel" plusieurs fois et que décide d'invalider la minuterie, que ce soit de ne pas supprimer de la NSRunLoop ou NSRunLoop a une autre source d'entrée derrière la scène.
OriginalL'auteur Rob Keniger