0

私はXcodeを使用してタイマーを実装し、時間外に計算を実行しています。ただし、タイマーが反復をスキップすることがよくあり、すべての計算が中断されます。

- (void)Time
{

  if (running==false) return;

  NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate];
  NSTimeInterval elapsed = currentTime - startTime;

  int mins = (int) (elapsed / 60.0);

  elapsed -= mins* 60;
  int seconds = (int) (elapsed);
  elapsed -= seconds;
  int fraction = elapsed * 100.0;
  beepTime = [self Dec:seconds+elapsed];



  [self mod];



  label.text= [NSString stringWithFormat:@"%u:%02u.%.01u",mins,seconds,fraction/10];



  [self performSelector:@selector(Time) withObject:nil afterDelay:0.01];


}

これはいくつかのログの小さなサンプルです

2012-08-14 20:25:04.659  RT 8.470000  BP 50.710000 MT 8.360000
2012-08-14 20:25:04.671  RT 8.470000  BP 50.720000 MT 8.370000
2012-08-14 20:25:04.682  RT 8.470000  BP 50.740000 MT 8.390000

BP 50.730000 と MT 8.380000 がスキップされていることに注意してください。

助言がありますか?

乾杯!

4

1 に答える 1

1

-performSelector:withObject:afterDelay: に関するドキュメントを読むと、メッセージが 0.01 秒の遅延の後に正確に送信されるという保証はありません。代わりに、メッセージは 0.01 秒後にイベント キューに入れられ、その順番になるたびに発火されると書かれています。

NSTimer のメソッド +scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: を使用する方がよい場合があります。

タイマーは現在の実行ループでも performSelector と同様に機能しますが、少なくとも 0.01 + (実行にかかった時間 -Time メソッド本体) では実行されません。

その NSTimer メソッドを一度だけ呼び出し、その戻り値を使用してタイマーを無効にする必要があることに注意してください。

于 2012-08-14T10:58:47.393 に答える