0

NSTimerを使用して、特定の瞬間からカウントします。

int totalSeconds;
int totalMinutes;
int totalHours;

totalSecondsが60の場合、totalMinutsは+1になります。その非常にシンプルで動作するはずです。たとえば、私は自分のMacの時計と一緒にNSTimerを起動しました。(シミュレーターで実行)。Macの時計とタイマーを見て、最初の10〜20秒の時間を比較すると、完全に同期しています。その後、変動するか、5秒以上進みます。だから私は私のタイマーを出力し、これを見つけました:

  • 2012-10-24 14:45:44.002 xxApp driveTime:0:0:44
  • 2012-10-24 14:45:45.002 xxApp driveTime:0:0:45
  • 2012-10-24 14:45:45.813 xxApp driveTime:0:0:46
  • 2012-10-24 14:45:46.0​​02 xxApp driveTime:0:0:47

ご覧のとおり、ミリ秒のタイミングは002です。しかし、3行目では813です。これは非常にランダムに発生し、変動を引き起こします。

より安定したカウント方法はありますか?

4

1 に答える 1

2

NSTimerのドキュメントから

タイマーはリアルタイムのメカニズムではありません。タイマーが追加された実行ループ モードの 1 つが実行中で、タイマーの起動時間が経過したかどうかを確認できる場合にのみ起動します。典型的な実行ループが管理するさまざまな入力ソースのため、タイマーの時間間隔の有効な分解能は 50 ~ 100 ミリ秒程度に制限されます。

プログラムが実行を開始してから経過した合計時間を計算することが目標である場合、これは非常に簡単です。時間の追跡を開始したい場合は-[NSDate date]、変数に格納します。経過時間を計算したいときはいつでも、 を最初の呼び出しの結果を格納したプロパティであると-[NSDate date仮定して、再度呼び出して次のことを行います。originalDate-[NSDate date]

NSDate *presentDate = [NSDate date];
NSTimeInterval runningTime = [presentDate timeIntervalSinceDate:originalDate];

runningTime時間の追跡を開始してから経過した合計秒数になります。時、分、秒などの数を取得するには、NSDateComponentsオブジェクトを使用する必要があります。

このメカニズムにより、タイマーを使用して、精度を失うことなく「1 秒に約 1 回」総実行時間を更新できます。

于 2012-10-24T13:39:26.300 に答える