2011-07-13 1 views
6

可能性の重複:
UIScrollView pauses NSTimer until scrolling finishesUIWebView iPhoneでスクロールするときにタイマーが停止するのはなぜですか?

NSTimerは、すぐに私はのUIWebViewにスクロールすると停止し、なぜ私はトラブルを考え出すのビットを持っています。次のコードを見てみてください(私は、これは宿題のサイトではありませんけど、私は正直にこだわっています):

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSString *address = @"http://en.m.wikipedia.org/wiki/"; 
    NSURL *url = [NSURL URLWithString:address]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [wiki loadRequest:request]; 
    time = 0; 
    countValue = 0; 
    timer = [NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(updateTimer) userInfo: nil repeats: YES]; 
    timeRand = 0; 
    countValueRand = 1; 
    randomTimer = [NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(updateRandomTimer) userInfo: nil repeats: YES]; 
    [self generateWordsArray]; 
} 
+1

何も、どのようにあなたを見て、'?あなたのタイマーを止める何かがありますか?スクロールしてタイマーを止めてもよろしいですか? –

+1

が停止または遅延しましたか? –

+0

こんにちは、あなたの助けをありがとう、しかし、私はwebviewが機能してからタイマーを停止すると確信しています... – dyang

答えて

28

別のRunLoopModeにタイマーを追加する必要があります。デフォルトでは、タイマーがNSDefaultRunLoopModeに追加されます。これは、アプリケーションの実行ループがNSDefaultRunLoopModeにあるときだけタイマーが実行されることを意味します。

ユーザーが画面にタッチすると(たとえば、UIScrollViewをスクロールする)、実行ループのモードはNSEventTrackingRunLoopModeに切り替わります。そして今、実行ループはもはやNSDefaultRunModeにはなく、タイマーは実行されません。その醜い効果は、ユーザーが画面に触れるたびにタイマーがブロックされることです。それは、スクロールが完全に停止するまでタイマーがブロックされるため、ユーザーがスクロールしている時間になる可能性があります。ユーザーがスクロールを続けると、タイマーは再びブロックされます。

この問題の解決方法は非常に簡単です。別のNSRunLoopModeにタイマーを追加することができます。タイマーをNSRunLoopCommonModesに追加すると、すべての実行ループモード(正確には、「共通」モードのセットのメンバーとして宣言されている)で実行されます。これは、タイマーがNSDefaultRunLoopModeだけでなく、NSEventTrackingRunLoopMode(ユーザーが画面に触れるとき)で動作していることを意味します。だから、

あなたのタイマーを初期化した後、NSRunLoopCommonModesに追加: - (無効)updateTimer`と ` - (無効)updateRandomTimer`ここで本当に問題

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
+5

あなた、私の友人はすごくうんざりしています! – dyang

+0

私の友人も! –

1

まあユーザインタラクション・ブロックメインスレッドをそれに自分自身を追加すると、タイマーが遅れているので、現在のスレッドの実行ループ

ユーザーの操作に関係なくタイマーを呼び出す場合は、新しいスレッドを作成し、そのスレッドにタイマーを付加することを検討する必要があります。

また、GCD based timerマイクアッシュでバックグラウンドで実行することもできます。あなたが覚えておかなければならないのは、UIの更新がメインスレッド上で行われなければならないということだけです。

+0

ご協力いただきありがとうございます! – dyang

関連する問題