5

NSTimerを使用して指数バックオフで再試行ロジックを実装しようとしています。私のコードは次のようになります:

-(void)start
{
  [NSTimer scheduledTimerWithTimeInterval:0.0 target:self
    selector:@selector(startWithTimer:) userInfo:nil repeats:NO];
}

-(void)startWithTimer:(NSTimer *)timer
{
  if (!data.ready) {
    // timer.timeInterval == 0.0 ALWAYS!
    NSTimeInterval newInterval = timer.timeInterval >= 0.1 ? timer.timeInterval * 2 : 0.1;
    newInterval = MIN(60.0, newInterval);
    NSLog(@"Data provider not ready. Will try again in %f seconds.", newInterval);
    NSTimer * startTimer = [NSTimer scheduledTimerWithTimeInterval:newInterval target:self
        selector:@selector(startWithTimer:) userInfo:nil repeats:NO];
    // startTimer.timeInteval == 0.0 ALWAYS!
    return;
  }

  ...
}

私が抱えている問題は、タイマーNSTimerのcheduledTimerWithTimeIntervalが、提供している間隔を無視しているように見え、常に0.0に設定していることです。私がここで間違っていることについて何か提案はありますか?

4

1 に答える 1

5

Apple のドキュメントには、 のtimeIntervalプロパティについて次のように書かれていますNSTimer

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nstimer_Class/Reference/NSTimer.html

受信者が繰り返しのないタイマーの場合、(時間間隔が設定されていても) 0 を返します。

タイマー間隔を追跡するには、他の手段を使用する必要があります。クラスにiVarをお勧めします。

-(void)start
{
  _timeInterval = 0.0;
  [NSTimer scheduledTimerWithTimeInterval:_timeInterval target:self
    selector:@selector(startWithTimer:) userInfo:nil repeats:NO];
}

-(void)startWithTimer:(NSTimer *)timer
{
  if (!data.ready) {
    _timeInterval = _timeInterval >= 0.1 ? _timeInterval * 2 : 0.1;
    _timeInterval = MIN(60.0, _timeInterval);
    NSLog(@"Data provider not ready. Will try again in %f seconds.", _timeInterval);
    NSTimer * startTimer = [NSTimer scheduledTimerWithTimeInterval:_timeInterval target:self
        selector:@selector(startWithTimer:) userInfo:nil repeats:NO];
    return;
  }

  ...
}
于 2012-04-23T04:50:18.660 に答える