En Swift 2, pude usar dispatch_afterpara retrasar una acción usando el despacho central magnífico:
var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
// your function here
})
Pero esto ya no parece compilarse desde Swift 3. ¿Cuál es la forma preferida de escribir esto en Swift moderno?
swift
swift4
grand-central-dispatch
swift5
Brandonscript
fuente
fuente

UInt64?Respuestas:
La sintaxis es simplemente:
Tenga en cuenta que la sintaxis anterior de agregar
secondscomo aDoubleparece ser una fuente de confusión (especialmente porque estábamos acostumbrados a agregar nsec). EsaDoublesintaxis de "agregar segundos como " funciona porquedeadlinees unaDispatchTimey, detrás de escena, hay un+operador que tomará unaDoubley agregará esa cantidad de segundos aDispatchTime:Pero, si realmente desea agregar un número entero de mseg, μs o nsec a
DispatchTime, también puede agregar aDispatchTimeIntervala aDispatchTime. Eso significa que puedes hacer:Todo esto funciona a la perfección debido a este método de sobrecarga separado para el
+operador de laDispatchTimeclase.Se le preguntó cómo se cancela una tarea despachada. Para hacer esto, use
DispatchWorkItem. Por ejemplo, esto inicia una tarea que se activará en cinco segundos, o si el controlador de vista se descarta y se desasigna,deinitcancelará la tarea:Tenga en cuenta el uso de la
[weak self]lista de captura en elDispatchWorkItem. Esto es esencial para evitar un ciclo de referencia fuerte. También tenga en cuenta que esto no hace una cancelación preventiva, sino que simplemente detiene la tarea de comenzar si aún no lo ha hecho. Pero si ya ha comenzado cuando encuentra lacancel()llamada, el bloque finalizará su ejecución (a menos que esté verificando manualmenteisCancelleddentro del bloque).fuente
DispatchTimeIntervalentregas, como.millisecondsrequierenInt. Pero si solo agregara segundos, usaríaDouble, por ejemplolet n: Double = 1.0; queue.asyncAfter(deadline: .now() + n) { ... }.Swift 4:
Por el momento
.seconds(Int),.microseconds(Int)y.nanoseconds(Int)también puede ser utilizado.fuente
.millisecondsEs mejor que el doble.DispatchTimeIntervalvalores de enumeración.case seconds(Int)case milliseconds(Int)case microseconds(Int)case nanoseconds(Int).milliseconds is better than Double.- Quiero eso en una camiseta;).Si solo quieres la función de retraso en
Swift 4 y 5
Puedes usarlo como:
fuente
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: closure)es más simpledespués del lanzamiento de Swift 3, también se debe agregar @escaping
fuente
Un sabor algo diferente de la respuesta aceptada.
Swift 4
fuente
Swift 4
Puede crear una extensión en DispatchQueue y agregar un retraso de función que use la
DispatchQueuefunción asyncAfter internamentey use
fuente
llamada
DispatchQueue.main.after(when: DispatchTime, execute: () -> Void)Recomiendo encarecidamente utilizar las herramientas de Xcode para convertir a Swift 3 (Edición> Convertir> A sintaxis Swift actual). Esto me atrapó
fuente
En Swift 4.1 y Xcode 9.4.1
La respuesta simple es ...
fuente
Swift 5 y superior
fuente
Ninguna de las respuestas mencionó ejecutarse en un hilo no principal, por lo que agregué mis 2 centavos.
En la cola principal (hilo principal)
O
En la cola global (subproceso no principal, basado en QOS especificado).
O
fuente
Esto funcionó para mí en Swift 3
fuente
Puedes usar
fuente
prueba esto
fuente