¿Cómo puedo retrasar una llamada a un método por 1 segundo?

¿Existe un modo fácil de retrasar una llamada a un método durante 1 segundo?

Tengo un UIImageView que reactjs en un evento táctil. Cuando se detecta el toque, algunas animaciones ocurren en la aplicación. Después de un segundo, quiero llamar a otro método. En este caso, no puedo usar el selector animationDidStop .

 performSelector:withObject:afterDelay: 

Referencia de documento

También puedes usar un bloque

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ [object method]; }); 

La mayoría de las veces querrá usar dispatch_get_main_queue, aunque si no hay UI en el método, podría usar una cola global .

Editar:

Swift 3 versión:

 DispatchQueue.main.asyncAfter(deadline: .now() + 1) { object.method() } 

Igualmente, DispatchQueue.global().asyncAfter(... también podría ser una buena opción.

La mejor manera de hacerlo es:

 [self performSelector:@selector(YourFunctionName) withObject:(can be Self or Object from other Classes) afterDelay:(Time Of Delay)]; 

también puede pasar nil como con el parámetro Object.

ejemplo:

 [self performSelector:@selector(subscribe) withObject:self afterDelay:3.0 ]; 

Ya hay muchas respuestas y todas son correctas. En caso de que desee utilizar el dispatch_after , debe buscar el fragmento que se incluye dentro de la Code Snippet Library fragmentos de Code Snippet Library en la parte inferior derecha (donde puede seleccionar los elementos de la UI ).

enter image description here

Entonces solo necesita llamar a este fragmento escribiendo el despacho en el código:

enter image description here

Puede usar el selector de rendimiento para después de que el método de demora de 0.1 segundos sea llamado para que el siguiente código haga esto.

 [self performSelector:@selector(InsertView) withObject:nil afterDelay:0.1]; 

Tú también puedes:

 [UIView animateWithDuration:1.0 animations:^{ self.view.alpha = 1.1; /* Some fake chages */ } completion:^(BOOL finished) { NSLog(@"A second lapsed."); }]; 

En este caso, debe falsificar algunos cambios en algunas vistas para que funcione la animación. De hecho, es bastante hacky, pero me encantan las cosas basadas en bloques. O termine la respuesta de @mcfedr a continuación.


 waitFor(1.0, ^ { NSLog(@"A second lapsed"); }); 

 typedef void (^WaitCompletionBlock)(); void waitFor(NSTimeInterval duration, WaitCompletionBlock completion) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^ { completion(); }); } 

Puedes hacerlo

 [self performSelector:@selector(MethodToExecute) withObject:nil afterDelay:1.0 ]; 

Swift 2.x

 let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC))) dispatch_after(delayTime, dispatch_get_main_queue()) { print("do some work") } 

Swift 3.x – y – Swift 4

 DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { print("do some work") } 

Hay una solución Swift 3 de la solución comprobada:

 self.perform(#selector(self.targetMethod), with: self, afterDelay: 1.0) 

Y está el método

 @objc fileprivate func targetMethod(){ } 

Usar en Swift 3

 perform(, with: , afterDelay:  

NOTA: esto detendrá todo el hilo, no solo el método.
Haga una llamada para dormir / esperar / detenerse durante 1000 ms justo antes de llamar a su método?

 Sleep(1000); // does nothing the next 1000 mSek Methodcall(params); // now do the real thing 

Editar: la respuesta anterior se aplica a la pregunta general “¿Cómo puedo retrasar una llamada a un método durante 1 segundo?”, Que era la pregunta al momento de la respuesta (de hecho, la respuesta se dio dentro de los 7 minutos de la pregunta original: )). No se proporcionó información sobre el idioma en ese momento, por lo que amablemente deja de quejarte acerca de la forma correcta de usar sleep i XCode y la falta de clases …