En Swift 2, pude usar dispatch_after
para 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
seconds
como aDouble
parece ser una fuente de confusión (especialmente porque estábamos acostumbrados a agregar nsec). EsaDouble
sintaxis de "agregar segundos como " funciona porquedeadline
es unaDispatchTime
y, detrás de escena, hay un+
operador que tomará unaDouble
y 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 aDispatchTimeInterval
a 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 laDispatchTime
clase.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,deinit
cancelará 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 manualmenteisCancelled
dentro del bloque).fuente
DispatchTimeInterval
entregas, como.milliseconds
requierenInt
. 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
.milliseconds
Es mejor que el doble.DispatchTimeInterval
valores 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
DispatchQueue
funció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