2016-11-15 3 views
2

J'ai utilisé la catégorie NSTimer pour créer un temporisateur avec un bloc de https://github.com/jivadevoe/NSTimer-Blocks. J'essaie d'invalider la minuterie dans l'une de mes méthodes avant que la minuterie ne se déclenche, mais ça ne marche pas. Mon code est le suivant:Invalider NSTimer avec un bloc qui n'a pas encore été déclenché: Objective-C

-(void)addQuestionView 
{ 
    if([resizeTimer isValid]) 
      [resizeTimer invalidate]; 
    . 
    . 
    . 
    . 
    . 

    [webView loadHTMLString:questionHtmlStr 
      baseURL:nil]; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    resizeTimer = [NSTimer scheduledTimerWithTimeInterval:4.0 block:^{ 

    //calculating height based on content 
    //changing webView's contsraints 


    } repeats:NO]; 

    . 
    //long process 
    //animation 
    . 

} 

Comme dans le code ci-dessus, si la méthode addQuestionView appelée 1ère fois, minuteur réglé à courir après 4 secondes. Si addQuestionView est appelé immédiatement, disons après 1 seconde, je veux que resizeTimer soit invalide afin d'éviter toute inconduite dans le calcul de la hauteur et la modification des contraintes de webView. J'ai vérifié cela en NSLogging certaines valeurs, son ne pas être invalidé, et être appelé deux fois. Quelqu'un a une solution, alors s'il vous plaît aidez-moi.

Merci!

+1

Avez-vous vérifié que 'invalidate' est envoyé du même fil sur lequel la minuterie a été installé ? – clemens

+0

@Rob. Merci de m'avoir signalé. "webViewDidFinishLoad est appelé à nouveau avant que l'ancien timer ne soit invalidé/viré." - C'est pareil. – iAkki

Répondre

0

Vous devez vous assurer que vous invalider la minuterie avant (le cas échéant) avant instanciation d'une nouvelle minuterie, par exemple:

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    if ([resizeTimer isValid]) 
     [resizeTimer invalidate]; 

    resizeTimer = [NSTimer scheduledTimerWithTimeInterval:4.0 block:^{ 
     ... 
    } repeats:NO]; 

    .... 
}