44 votes

Comment puis-je mettre en pause par programmation un NSTimer?

J'utilise un NSTimer pour effectuer un rendu dans une application iPhone basée sur OpenGL. J'ai une boîte de dialogue modale qui apparaît et demande à l'utilisateur d'entrer. Pendant que l'utilisateur fournit des informations, j'aimerais "mettre en pause", par exemple:

 [myNSTimer pause];
 

J'utilise cette syntaxe parce que je fais des choses comme:

 [myNSTimer invalidate];
 

quand je veux que ça s'arrête.

Comment puis-je mettre par programme le NSTimer en pause?

36voto

Thiru Points 387

Je viens de penser à la mise à jour de corrections mineures à la réponse de kapesoftware :

NSDate * pauseStart, * previousFireDate;

 -(void) pauseTimer:(NSTimer *)timer { 

    pauseStart = [[NSDate dateWithTimeIntervalSinceNow:0] retain];

    previousFireDate = [[timer fireDate] retain];

    [timer setFireDate:[NSDate distantFuture]];
}

-(void) resumeTimer:(NSTimer *)timer {

    float pauseTime = -1*[pauseStart timeIntervalSinceNow];

    [timer setFireDate:[previousFireDate initWithTimeInterval:pauseTime sinceDate:previousFireDate]];

    [pauseStart release];

    [previousFireDate release];
}
 

22voto

BobbyShaftoe Points 19925

À partir d'ici:

http://discussions.apple.com/thread.jspa?threadID=1811475&tstart=75

"Vous pouvez stocker la quantité de temps qui s'est écoulé depuis que la minuterie a commencé... Quand la minuterie commence à stocker la date dans un NSDate variable. Ensuite, lorsque l'utilisateur bascule... utiliser la méthode timeIntervalSinceNow dans le NSDate classe pour stocker combien de temps a passé... il faut noter que ceci va donner une valeur négative pour timeIntervalSinceNow. Lorsque l'utilisateur retourne utiliser cette valeur pour définir un minuteur.

Je ne pense pas qu'il y a un moyen pour mettre en pause et redémarrer la minuterie. J'ai fait face à une situation similaire. "

12voto

kapesoftware Points 101

Le chemin que j'ai accompli, c'était le stockage de la NSTimer tir date dans une variable et ensuite le réglage de la cuisson de la date à l'INFINI.

Quand je fais une pause:

pauseStart = [[NSDate dateWithTimeIntervalSinceNow:0] retain];
previousFiringDate = [timer firingDate];
[timer setFiringDate:INFINITY]

Quand j'ai relancer-je ajouter de la quantité de temps que le compte à rebours a été mis en pause pour le précédent tir date:

float pauseTime = -1*[pauseStart timeIntervalSinceNow];
[timer setFireDate:[previousFireDate initWithTimeInterval:pauseTime sinceDate:previousFireDate]];

De ce fait, il est beaucoup plus facile que de s'inquiéter de l'invalider et à la réinitialisation de la minuterie. J'ai eu beaucoup de minuteries donc, je viens de les mettre tous dans un tableau et fait pour tous. Je sous-classé le NSTimer afin de garder la previousFiringDate associé avec de la minuterie.

C'était aussi mieux que d'utiliser un BOOLÉEN de savoir si ou non il a été suspendu de sorte actions n'aurait pas lieu si le BOOL a été défini. C'est parce que si quelque chose était sur le point d'arriver avant la pause, il ne se produit pas après vous relancer, parce que ça aura été simplement ignorées.

8voto

Riley Points 61

La façon la plus simple de réussir est la suivante:

 -(void) timerToggle{
    if (theTimer == nil) {
        float theInterval = 1.0/30.0;
        theTimer = [NSTimer scheduledTimerWithTimeInterval:theInterval target:self selector:@selector(animateBall:) userInfo:nil repeats:YES];
    } else {
        [theTimer invalidate];
        theTimer = nil;
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X