2016-12-06 8 views
0

次のコードを使用して、uiを0.04時間間隔を与える2秒で50回更新します。しかし、メソッドupdateLabelsは、50回から5回または6回だけ呼び出されることがあります。これは私が何かの主なスレッドをブロックするためですか?あなたはそれを動作させる方法を知っていますか?NSTimerはセレクタの十分な時間を設定していません

self.timer = [NSTimer timerWithTimeInterval:0.04 
            target:self      
            selector:@selector(updateLabels) 
            userInfo:nil 
            repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; 
+2

「NSTimer」のドキュメントを読む必要があります。繰り返しタイマーが実際にどのように機能するかについての議論があります。 – rmaddy

+0

updateLabelsが5-6回呼び出されたことをどのように知っていますか? 40ms以上続くコードを実行する可能性はありますか? – icould

答えて

2

ポーリングが悪いと同じように、繰り返しプッシュも悪いです。

@rmaddyは言ったように、タイマーとその仕組みについてのドキュメントを読んでください。

代わりに、私はお勧めしたい:

  • 時間をマーク更新が行われたときに更新
  • を行い、時間を確認>場合は更新間隔よりも
  • を経過し、更新
  • を行います
  • は<場合は更新間隔よりも、遅れて更新を行う

上記はおそらくあなたが望むものではないことに注意してください。 UIKitビューを更新している場合は、更新が統合され、バックグラウンドスレッドで描画が行われる可能性があります。私。更新計算が完了すると、画面が完全に描画されないことがあります。

だけでなく、データが本当にすぐそれを変更されていない限り、あなた本当にはアップデートN回二をやっているしたくありません。それがすぐにそれを変更している場合は、CADisplayLinkを見て、特定のフレーム/秒の更新レートをターゲットにするようにコードを設計します。それがすぐに変更されていない場合は、データが変更されたときにのみ更新します。同じことを再描画することは、バッテリ寿命の無駄です。

関連する問題