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];
Creé una categoría en NSTimer que hace posible usarla con bloques.
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.