ios - framework - cocoa touch español
Objective-C Acción de retardo con bloques. (3)
Sé que hay varias formas de retrasar una acción en Objective-C como:
performSelector:withObject:afterDelay:
o utilizando NSTimer
.
Pero hay una cosa tan elegante llamada bloques donde puedes hacer algo como esto:
[UIView animateWithDuration:1.50 delay:0 options:(UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState) animations:^{
}completion:^(BOOL finished){
}];
Desafortunadamente, este método aplica solo para animar cosas.
¿Cómo puedo crear un retraso con un bloqueo en un método para no tener que usar todos esos @selectors
y sin la necesidad de crear un nuevo método separado ? ¡Gracias!
Ampliando la respuesta aceptada, creé una función de ayuda para cualquiera que no quiera memorizar la sintaxis cada vez que quiera hacer esto :) Simplemente tengo una clase de Utils con esto:
Uso:
[Utils delayCallback:^{
//--- code here
} forTotalSeconds:0.3];
Método de ayuda:
+ (void) delayCallback: (void(^)(void))callback forTotalSeconds: (double)delayInSeconds{
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
if(callback){
callback();
}
});
}
Aquí es cómo puede activar un bloque después de un retraso en Swift:
runThisAfterDelay(seconds: 4) { () -> () in
print("Prints this 4 seconds later in main queue")
// Or just call animatedMyObject() right here
}
/// EZSwiftExtensions
func runThisAfterDelay(seconds seconds: Double, after: () -> ()) {
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC)))
dispatch_after(time, dispatch_get_main_queue(), after)
}
Se incluye como una función estándar en mi repositorio: https://github.com/goktugyil/EZSwiftExtensions
utilizar dispatch_after:
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
//code to be executed on the main queue after delay
[self doSometingWithObject:obj1 andAnotherObject:obj2];
});