2010-11-11 4 views
18

J'ai le code suivant:Comment changer le timing pour NSTimer?

timer = [[NSTimer scheduledTimerWithTimeInterval:0.50 target:self selector:@selector(onTimer) userInfo:nil repeats:YES] retain];  

-(void) onTimer 
{ 
} 

Après toutes les 0,50 secondes la méthode OnTimer est appelée. Mais maintenant je veux incrémenter l'intervalle de temps.

Cela signifie:

OnTimer calls after 0.55 
OnTimer calls after 0.60 
OnTimer calls after 0.65 
OnTimer calls after 0.70 
OnTimer calls after 0.75 
& so on. 

est-il une solution pour cela ?? J'ai beaucoup essayé mais ça ne marche pas.

Répondre

21

Bien sûr, vous pouvez le faire. Remplacez repeats:YES par repeats:NO afin que la minuterie ne se répète pas, puis en onTimer, démarrez simplement une nouvelle minuterie avec un intervalle plus long. Vous avez besoin d'une variable pour maintenir votre intervalle de sorte que vous puissiez le rendre un peu plus long chaque fois par onTimer. De plus, vous n'avez probablement plus besoin de conserver le chronomètre, car il ne tirera qu'une seule fois, et quand c'est le cas, vous aurez un nouveau chronomètre.

Je ne suis pas expert Objective-C (ou un expert iOS ...) et il a été un certain temps, mais je pense que quelque chose comme ceci:

float gap = 0.50; 

[NSTimer scheduledTimerWithTimeInterval:gap target:self selector:@selector(onTimer) userInfo:nil repeats:NO]; 

-(void) onTimer { 
    gap = gap + .05; 
    [NSTimer scheduledTimerWithTimeInterval:gap target:self selector:@selector(onTimer) userInfo:nil repeats:NO]; 
} 

Quelque chose comme ça? Oh, et je ne suis pas vraiment sûr de la sémantique retain ici ... lisez les docs pour vous assurer que vous ne fuyez pas!

+0

Merci, cela fonctionne bien maintenant. –

+0

L'objet NSTimer sera automatiquement libéré à la fin de la temporisation. – qwertz

4

Vous pouvez essayer de régler la minuterie de FireDate, voir setFireDate

6

Voici une solution à la question de Hardik en utilisant la propriété fireDate de NSTimer (écrit à Swift):

var timeInterval = 0.50 
NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: Selector("onTimer:"), userInfo: nil, repeats: true) 

func onTimer(timer: NSTimer) { 
    timeInterval += 0.05 
    timer.fireDate = timer.fireDate.dateByAddingTimeInterval(timeInterval) 
} 
+0

vous ne pouvez pas _re-fire_ un minuteur comme celui-ci. – holex

+0

pour moi cela fonctionne. Voici le code: https://gist.github.com/anonymous/86005ed7049e985a34f6 Et btw. la minuterie a répété sur vrai et je suis juste en train de régler la date du prochain incendie. –

+1

Pour autant que je lis la documentation pour NSTimer en utilisant setFireDate est absolument bien (https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/NSTimer_Class/Reference/NSTimer.html#// apple_ref/occ/instm/NSTimer/setFireDate :). –

1

Vous ne pouvez pas modifier l'intervalle auquel un feux de minuterie. En aucune façon. Il n'y a pas d'API pour le faire.

Deux solutions de contournement évidentes: Si vous toujours modifiez l'intervalle, vous pouvez simplement modifier la prochaine fois que le temporisateur se déclenche; ceci a préséance sur l'intervalle de la minuterie. Bien sûr, vous devez le faire à chaque fois que la minuterie se déclenche. Si vous parfois modifiez l'intervalle, il suffit d'invalider le premier temporisateur et de créer un nouveau temporisateur avec le nouvel intervalle.

0

Cela fonctionne comme un charme pour moi.

- (void)FlexibleTimer { 
    if (!keyTimer) { 
     keyTimer = [NSTimer scheduledTimerWithTimeInterval:self.intervalOfIdleTimer 
                 target:self 
                selector:@selector(keyTimerExceeded) 
                userInfo:nil 
                repeats:YES]; 
    } 
    else { 
     if (fabs([keyTimer.fireDate timeIntervalSinceNow]) < self.intervalOfIdleTimer - 1.0) { 
      [keyTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:self.intervalOfIdleTimer]]; 
     } 
    } 
} 

- (void)keyTimerExceeded { 
    [self setNextDelayForFlexibleTimer]; 
    [self FlexibleTimer]; 
    NSLog(@"Timer Exceeded %f", [[NSDate date] timeIntervalSince1970]); 
}