2

NSTimerWi-Fiが有効になっている場合、バックグラウンドで定期的にデータをダウンロードしていました。ただし、データを手動でダウンロードするボタンを押すオプションもあります。したがって、autoupdater を有効または無効にすることができます。自動更新を無効にして期間が「中断」された場合、有効にした時点からこの期間の残り時間が終わったときに次の更新をスケジュールしたい。NSTimer には一時停止メソッドがないため、NSTimer の initWithFireDate メソッドを使用します。

timer = [[NSTimer alloc] initWithFireDate:fireDate interval:updateFrequency target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

これfireDateは間違いなく指定された日付より後です:

NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:remainingWaitingTime];

それにもかかわらず、タイマーはタイマーの初期化後にスケジュールされます。タイマーを無効にして、次の方法で残り時間を計算しています。

NSDate *lastFireDate = [timer fireDate];
NSDate *current = [NSDate date];
[timer invalidate];
double timeSinceLastFire = [current timeIntervalSinceDate:lastFireDate];
remainingWaitingTime = updateFrequency - timeSinceLastFire;

計算された時間 (remainingWaitingTime) は正しい値です。

私は何を間違っていますか?

よろしく、 ファビアン

4

1 に答える 1

1

次のようにして、タイマーを実行ループに追加する必要があります。

[[NSRunLoop currentRunLoop] addTimer: timer forMode: NSDefaultRunLoopMode];
于 2015-02-14T16:44:39.670 に答える