2010-07-01 18 views
1

Je suis conscient des nombreuses questions concernant ce sujet, comme je l'ai moi-même demandé auparavant, mais mon problème semble maintenant plus lié à la partie threading. J'ai les 2 méthodes suivantes.Fileté NSTimer

-(void) restartTimer { 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1. 
              target:self 
              selector:@selector(dim) 
              userInfo:nil 
              repeats:YES]; 
    time = 31; 
    NSLog(@"calling restart timer"); 
    [self performSelectorOnMainThread:@selector(timerImageUpdate) withObject:nil waitUntilDone:NO]; 

    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode]; 
    [[NSRunLoop currentRunLoop] run]; 

    [pool drain]; 

} 

-(void) resumeTimer { 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1. 
              target:self 
              selector:@selector(dim) 
              userInfo:nil 
              repeats:YES]; 
    NSLog(@"calling resume timer"); 

    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode]; 
    [[NSRunLoop currentRunLoop] run]; 

    [pool drain]; 

} 

La fonction restartTimer est appelée au début de la partie. Cela fonctionne très bien et la minuterie déclenche bien le sélecteur de luminosité. Le problème se produit lorsque l'utilisateur clique sur mon bouton de saut en succession rapide. [skip] met à jour un MKMapView et dans la méthode déléguée mapdidfinishloading le follwing est appelé: [NSThread detachNewThreadSelector: @selector (restartTimer) toTarget: self avecObjet: nil];
Lorsque cela se produit, il semble que plusieurs temporisateurs soient créés et que par conséquent, ma fonction d'obscurcissement soit trop souvent appelée, ce qui donne l'impression que le fonctionnement du temporisateur unique est très rapide. Quelle est la meilleure façon de démarrer et redémarrer la minuterie en utilisant un thread secondaire? Notez ce problème semble seulement se produire si le bouton de passage est pressé à plusieurs reprises et rapidement, alors que cela fonctionne bien si juste pressé de temps en temps?

Vous avez des idées? Un grand merci

Jules

Répondre

0

Vous pouvez utiliser un bool savoir si vous avez un fonctionnement de la minuterie ou non. Lorsque vous démarrez la minuterie, vous la définissez sur true, lorsque vous arrêtez la minuterie, vous la définissez sur false. Lorsque la fonction de minuterie de reprise est appelée, vous vérifiez cette variable et si elle est vraie, vous ne démarrez pas une nouvelle minuterie.

Une autre solution consisterait à limiter l'interaction de l'utilisateur avec le bouton. Si vous appuyez sur le bouton, vous le laissez inactif pendant un certain temps.

+0

Merci pour votre aide. Cela peut fonctionner mais le vrai problème que j'ai est pourquoi le minuteur n'est pas invalidant? Timer est une propriété de classe et je le crée sur un thread secondaire. Quand il s'agit d'invalider cela est fait sur le fil principal, cela pourrait-il être la cause? – Jules