1

私は NSTimers を使用して、時間に敏感な特定のイベントをアプリでトリガーしています (基本的に、最大 2 番目の解像度で発生するように指示したときに発生する必要があります)。ただし、タイマーが以前に起動することが時々あったため、タイマーが起動した日付を記録すると、14:34:59代わりに14:35:00. これは少し面倒です。ドキュメントで説明を検索したところ、次のことがわかりました。

  • 典型的な実行ループが管理するさまざまな入力ソースのため、タイマーの時間間隔の有効な分解能は 50 ~ 100 ミリ秒程度に制限されます。

この:

  • 長い呼び出し中、または実行ループがタイマーを監視していないモードである間にタイマーの起動時間が発生した場合、実行ループが次にタイマーをチェックするまで、タイマーは起動しません。

したがって、タイマーの分解能は 100 ミリ秒であり、タイマーが以前にトリガーされる理由を説明できますが、それが意味をなす場合に限られます。そうでない理由は、100 ミリ秒の差が遅延によって引き起こされたものであり、その逆ではないと考えるからです。

では、1:タイマーが時間前にトリガーされるのはなぜですか? 2:どうすればこれを回避できますか?

編集:

これは私が日付を計算する方法です:

  1. NSDate オブジェクトから始めます ([NSDate now] または NSDatePicker からの日付)
  2. NSDateComponents を使用して、その日付x日数に加算します
  3. 再び NSDateComponents を使用して、その日付の時間、数、および秒を設定します (ただし、ステップ 2 から日/月/年を保持します)。
  4. 私はこのようにタイマーを設定しました:

    timer = [NSTimer timerWithTimeInterval: 10 ターゲット: 自己セレクター: @selector(myMethod) userInfo: nil 繰り返し: NO];

    [タイマー setFireDate: 発射日];

    [[NSRunLoop currentRunLoop] addTimer: モードのタイマー: NSRunLoopCommonModes];

編集2:

また、(時間/分/秒の代わりに) 時間間隔をログに記録しました。これは常にx.0000です。つまり、秒の正確な開始点であり、正確に(前ではなく、後ではなく)どのようにすべきかを意味します。

4

1 に答える 1