2011-11-17 9 views
8

1秒ごとに特定のものを記録し、現在はNSTimerを使用しているアプリケーションがありますが、アプリケーションが画面(またはほとんど何か他のもの)に移行した場合、少し遅くなります不正確な読みになります。NSTimer信頼性の高い代替方法

信頼できる代替手段は何ですか?次のように私の現在のコードは次のとおりです。

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(update) userInfo:nil repeats:YES]; 

答えて

12

NSTimerは正確に時間通りに発射することは保証されません。しかし、あなたは今よりもずっと信頼できる方法でNSTimerを使うことができます。 scheduledTimerWithTimeIntervalを使用すると、実行ループにスケジュールされたNSTimerがNSDefaultRunLoopModeに作成されます。このモードは、UIの使用中に一時停止されるため、ユーザーの操作があったときにタイマーは起動しません。この一時停止を避けるには、モードNSRunLoopCommonModesを使用してください。これを行うには、自分でタイマーをスケジュールする必要があります:

timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(update) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
+0

申し訳ありませんが、今これを変更します。 '[timer invalidate]'と同じ方法でタイマーを無効にしますか? – Baub

+0

この方法で作成されたタイマーは、同じように相互作用します。ただし、手動で追加する必要があります。無効化を呼び出すと、前と同じようにrunloopから自動的に削除されます。 – NJones

4

あなた可能性:

  • は間隔を短く((それは仕方UIによって影響されない場合があります)と言う別のスレッドでNSTimerを入れて0.1秒)、あなたのロギング機能で、あなたが望むものを記録するための "正しい"時間であるかどうかをチェックします。
+0

NSTimerは独自の新しいスレッドを作成しません...?ちょうど尋ねる...私はそれがどこかで読む。 –

+1

私は、スティーブジョブズは分かりません。教えてください。 ;) – Baub

+0

私は 'performSelectorInBackground'を呼び出すことによって別のスレッドにタイマーを入れようとしましたが、起動時にセレクタを呼び出すことはありませんでした(私は別のスレッドであると思います)。 – Baub

関連する問題