Cómo progtwigr un retraso en Swift 3

En versiones anteriores de Swift, se podía crear un retraso con el siguiente código:

let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 4 * Int64(NSEC_PER_SEC)) dispatch_after(time, dispatch_get_main_queue()) { //put your code which should be executed with a delay here } 

Pero ahora, en Swift 3, Xcode cambia automáticamente 6 cosas diferentes, pero luego aparece el siguiente error: “No se puede convertir el valor de DispatchTime.now en el valor esperado dispatch_time_t aka UInt64 “.

¿Cómo se puede crear un retraso antes de ejecutar una secuencia de código en Swift 3?

Después de mucha investigación, finalmente me di cuenta de esto.

 DispatchQueue.main.asyncAfter(deadline: .now() + 2) { // change 2 to desired number of seconds // Your code with delay } 

Esto crea el efecto deseado de “espera” en Swift 3 y Swift 4.

Inspirado por una parte de esta respuesta .

Me gusta la notación de una línea para GCD, es más elegante:

  DispatchQueue.main.asyncAfter(deadline: .now() + 42.0) { // do stuff 42 seconds later } 

Además, en iOS 10 tenemos nuevos métodos de temporizador, por ejemplo, el inicializador de bloque:

(por lo que la acción retrasada puede cancelarse)

  let timer = Timer.scheduledTimer(withTimeInterval: 42.0, repeats: false) { (timer) in // do stuff 42 seconds later } 

Por cierto, tenga en cuenta: de forma predeterminada, el temporizador se agrega al modo de ciclo de ejecución predeterminado. Significa que el temporizador se puede congelar cuando este modo de ciclo está en espera (por ejemplo, al desplazar un UIScrollView). Puede resolver este problema agregando el temporizador al modo de ciclo de ejecución específico:

 RunLoop.current.add(timer, forMode: .commonModes) 

En esta publicación de blog puedes encontrar más detalles.

Pruebe la siguiente función implementada en Swift 3.0 y superior

 func delayWithSeconds(_ seconds: Double, completion: @escaping () -> ()) { DispatchQueue.main.asyncAfter(deadline: .now() + seconds) { completion() } } 

Uso

 delayWithSeconds(1) { //Do something } 

Pruebe el siguiente código para la demora

// MARK: First Way

 func delayForWork() { delay(3.0) { print("delay for 3.0 second") } } delayForWork() 

// MARK: Second Way

 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // your code here } 

También es posible usar esto:

 Thread.sleep(until: Date(timeIntervalSinceNow: 2.5)) 

Esta línea de código bloquea el hilo actual hasta que finaliza el tiempo especificado. El tiempo de demora se define en formato de fecha. La versión anterior del inicializador de Fecha solo toma un valor por segundo en formato doble. Este valor podría tener una resolución de milisegundos.

Tenga en cuenta que si llama a este código en el hilo principal, la IU se congelará durante el tiempo especificado.

// Ejecuta la función después de x segundos

 public static func runThisAfterDelay(seconds: Double, after: @escaping () -> Void) { runThisAfterDelay(seconds: seconds, queue: DispatchQueue.main, after: after) } public static func runThisAfterDelay(seconds: Double, queue: DispatchQueue, after: @escaping () -> Void) { let time = DispatchTime.now() + Double(Int64(seconds * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) queue.asyncAfter(deadline: time, execute: after) } 

//Utilizar:-

 runThisAfterDelay(seconds: x){ //write your code here }