framework español ios objective-c cocoa-touch

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]; });