Usando NSTimer para implementar la lógica de rebash con retroceso exponencial

Estoy intentando implementar la lógica de rebash con un backoff exponencial utilizando NSTimer. Mi código se ve así:

-(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; } ... } 

El problema que estoy teniendo es que el timer NSTimer scheduledTimerWithTimeInterval parece ignorar el intervalo que estoy proporcionando y siempre lo establece en 0.0. ¿Alguna sugerencia sobre qué estoy haciendo mal aquí?

La documentation de Apple dice lo siguiente sobre la propiedad NSTimer en NSTimer .

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

Si el receptor es un timer que no se repite, devuelve 0 (incluso si se estableció un intervalo de time).

Deberá usar otros medios para realizar un seguimiento de lo que debería ser el intervalo del timer. Recomiendo un iVar en tu class.

 -(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; } ... } 
    Intereting Posts