iphone objective-c nstimer

iphone - NSTimer con función/bloqueo anónimo?



objective-c (7)

Quiero poder programar tres eventos pequeños en el futuro sin tener que escribir una función para cada uno. ¿Cómo puedo hacer esto usando NSTimer ? Entiendo que los bloques facilitan las funciones anónimas, pero ¿se pueden usar dentro de NSTimer y, de ser así, cómo?

[NSTimer scheduledTimerWithTimeInterval:gameInterval target:self selector:@selector(/* I simply want to update a label here */) userInfo:nil repeats:NO];



En realidad puedes llamar:

NSTimer.scheduledTimerWithTimeInterval(ti: NSTimeInterval, target: AnyObject, selector: #Selector, userInfo: AnyObject?, repeats: Bool)

Úselo así:

NSTimer.scheduledTimerWithTimeInterval(1, target: NSBlockOperation(block: {...}), selector: #selector(NSOperation.main), userInfo: nil, repeats: true)


Es bastante fácil, pero no está incluido en el marco de Apple, al menos al menos.

Puede escribir un contenedor basado en NSTimer para NSTimer usted mismo, por ejemplo, usando GCD , o puede usar bibliotecas de terceros existentes como esta: https://github.com/jivadevoe/NSTimer-Blocks .


Me encanta este truco @ Peter-Pang !! BlockOperation se crea sobre la marcha, propio del Timer, que es propiedad de la cola en ejecución, y llama al selector principal en el bloque para ejecutarlo ... ¡¡¡¡¡¡¡¡¡¡¡lindo !!!

Actualizado para Swift 3

Timer.scheduledTimer(timeInterval: 1, target: BlockOperation { // ... }, selector: #selector(Operation.main), userInfo: nil, repeats: false)


Puede utilizar dispatch_after si desea lograr algo similar a NSTimer y bloquear la ejecución.

Aquí está el código de muestra para el mismo:

int64_t delayInSeconds = gameInterval; // Your Game Interval as mentioned above by you dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // Update your label here. });

Espero que esto ayude.


Versión Objective-C de la respuesta de @Peter Peng:

_actionDelayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[NSBlockOperation blockOperationWithBlock:^{ NSLog(@"Well this is useless."); }] selector:@selector(main) userInfo:nil repeats:YES];


Existe una API de temporizador basada en bloques en Cocoa (a partir de iOS 10+ / macOS 10.12+); así es como puedes usarla en Swift 3:

Timer(timeInterval: gameInterval, repeats: false) { _ in print("herp derp") }

... o en Objective-C:

[NSTimer scheduledTimerWithTimeInterval:gameInterval repeats:NO block:^(NSTimer *timer) { NSLog(@"herp derp"); }];

Si necesita apuntar a versiones del sistema operativo anteriores a iOS10, macOS 12, tvOS 10, watchOS 3, debe usar una de las otras soluciones.