Duplique la cantidad de time hasta el incendio de NSTimer

Estoy usando un NSTimer y, en ciertas circunstancias, quiero duplicar cuánto time antes de que se NSTimer el método NSTimer .

Básicamente: si tengo configurado para llamar cada 0,5 segundos, de vez en cuando quiero retrasarlo, por lo que espera 1,0 segundos (el doble de time) antes de la próxima vez que se llama.

Sin embargo, estoy teniendo mucha dificultad para implementar esto. Este fue mi bash inicial:

 - (void)viewDidLoad { [super viewDidLoad]; [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(timerMethod:) userInfo:nil repeats:YES]; } - (void)timerMethod:(NSTimer *)timer { static int variable = 1; switch (variable) { case 1: self.stopLightLabel.textColor = [UIColor networkingColor]; break; case 2: self.stopLightLabel.textColor = [UIColor orangeColor]; break; case 3: self.stopLightLabel.textColor = [UIColor yellowColor]; break; case 4: // Stop for twice as long here self.stopLightLabel.textColor = [UIColor greenColor]; NSTimeInterval timeBetweenNowAndFireDate = [timer.fireDate timeIntervalSinceNow]; // Create a new date that is twice as far in the future in order to give a long pause timer.fireDate = [NSDate dateWithTimeIntervalSinceNow:(timeBetweenNowAndFireDate * 2)]; break; case 5: self.stopLightLabel.textColor = [UIColor blueColor]; break; case 6: self.stopLightLabel.textColor = [UIColor purpleColor]; break; default: break; } variable++; } 

Trato de get la cantidad de time entre ahora mismo y cuando el timer se disparará. En el ejemplo anterior, esto debería ser 0.5 . Luego establezco el fireDate en un nuevo valor, que es el doble del anterior.

Esto no funciona, sin embargo.

Sin ese condicional, el timer funciona normalmente, pero obviamente no se demora en una circunstancia determinada (para esa circunstancia obtiene el mismo time que todo lo demás).

Con el condicional, ¡parece más corto incluso! De hecho, no se alarga hasta que lo multiplico por alnetworkingedor de 400 en lugar de 2.

¿Qué estoy haciendo mal aquí?

llama al código para modificar el FireDate dentro del método timerFinetworking. Eso es muy temprano The fireDate es la date en que el timer disparó … no se actualiza todavía.

Una solución fácil: envuélvalo en un envío asíncrono. que permite que el timer regrese y actualice su date de lanzamiento ANTES de intentar modificarlo:

código fijo:

 - (void)timerMethod:(NSTimer *)timer { static int variable = 1; dispatch_async(dispatch_get_main_queue(), ^{ [self afterTimerFinetworking:timer]; } } - (void)afterTimerFinetworking:(NSTimer *)timer { static int variable = 1; switch (variable) { case 4: // Stop for twice as long here self.stopLightLabel.textColor = [UIColor greenColor]; ... NSTimeInterval timeBetweenNowAndFireDate = [timer.fireDate timeIntervalSinceNow]; NSLog(@"%f", timeBetweenNowAndFireDate); // Create a new date that is twice as far in the future in order to give a long pause timer.fireDate = [NSDate dateWithTimeIntervalSinceNow:(timeBetweenNowAndFireDate * 2)]; ... 

O

no fireDate = [NSDate dateWithTimeIntervalSinceNow:fire.timeInterval*2] async y haga fireDate = [NSDate dateWithTimeIntervalSinceNow:fire.timeInterval*2] que podría ser aún más limpio si es posible

Estoy bastante seguro de que no puedes cambiar el FireDate de un timer de carrera. (Esto es incorrecto. Consulte la edición a continuación).

El otro póster, Pablo, tenía la misma idea que yo. Si tiene un timer que dispara cada .5 segundos, agregue una variable de instancia BOOL skipThisInterval al object que es el objective del timer.

Luego, en el método del timer, si skipThisInterval es verdadero, simplemente reinicie skipThisinterval = FALS E y regrese sin hacer nada más. De esa manera, el timer se disparará nuevamente después de que haya pasado otro intervalo y luego continúe funcionando como antes.

De lo contrario, tendrá que invalidar el timer de ejecución, crear un nuevo timer que se activará una vez en la hora de finalización deseada y, luego, en el método que invoca el timer, crear un nuevo timer de repetición que se vuelve a activar en el intervalo anterior .

EDITAR: estaba equivocado Puede cambiar la date de disparo de un timer "en vuelo". (Gracias por Josh Caswell por corregirme en eso.)

Aún así, si solo quiere que su timer simplemente omita su próximo disparo y continúe, simplemente agregando lógica al método que invoca el timer para omitir la siguiente activación, parece más simple y más limpio que ajustar la date de lanzamiento (y los docs dicen que cambiar el fuego la date es relativamente costosa)