2016-11-15 6 views
2

NSTimerカテゴリを使用してブロックを持つタイマーをhttps://github.com/jivadevoe/NSTimer-Blocksから作成しました。そのタイマーが起動する前に私のメソッドの1つでタイマーを無効にしようとしていますが、そのタイマーは機能しません。上記のコードのようにまだ起動されていないブロックでNSTimerを無効にする: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 
    . 

} 

を、addQuestionView方法は、1回目呼び出された場合、タイマーは4秒後に実行するように設定されます:次のように私のコードです。 addQuestionViewが直ちに呼び出された場合、1秒後に「height」を計算しwebViewの制約を変更する際の不正行為を避けるため、resizeTimerを無効にします。 NSLoggingによっていくつかの値をチェックしました。無効にされず、2回呼び出されました。誰にでも解決策がありますので、私を助けてください。

ありがとうございます!

+1

あなたは 'invalidate'は、タイマーがインストールされた同じスレッドからの送信であることを確認しました? – clemens

+0

@Rob。私を指摘してくれてありがとう。 "古いタイマーが無効化され/起動される前に、webViewDidFinishLoadが再度呼び出されます。" - 同じことが起こっている。 – iAkki

答えて

0

あなたは例えば、新しいタイマーをインスタンス化する前に前にタイマー(もしあれば)を無効に確認してください:

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

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

    .... 
} 
関連する問題