Revisé el iBook de Apple y no pude encontrar ninguna definición:
¿Alguien puede explicar la estructura de dispatch_after
?
dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)
objective-c
swift
grand-central-dispatch
Kumar KL
fuente
fuente
Respuestas:
Una idea más clara de la estructura:
dispatch_time_t
es unUInt64
. Endispatch_queue_t
realidad, el tipo está alias a anNSObject
, pero solo debe usar sus métodos GCD familiares para obtener colas. El bloque es un cierre Swift. Específicamente,dispatch_block_t
se define como() -> Void
, que es equivalente a() -> ()
.Ejemplo de uso:
EDITAR:
Recomiendo usar la
delay
función realmente agradable de @ matt .EDITAR 2:
En Swift 3, habrá nuevos contenedores para GCD. Ver aquí: https://github.com/apple/swift-evolution/blob/master/proposals/0088-libdispatch-for-swift3.md
El ejemplo original se escribiría de la siguiente manera en Swift 3:
Tenga en cuenta que puede escribir la
deadlineTime
declaración comoDispatchTime.now() + 1.0
y obtener el mismo resultado porque el+
operador se anula de la siguiente manera (de manera similar para-
):func +(time: DispatchTime, seconds: Double) -> DispatchTime
func +(time: DispatchWalltime, interval: DispatchTimeInterval) -> DispatchWalltime
Esto significa que si no usa el
DispatchTimeInterval
enum
y simplemente escribe un número, se supone que está usando segundos.fuente
dispatch_after(1, dispatch_get_main_queue()) { println("test") }
1
dedispatch_after(1, ...
puede causar mucha confusión aquí. La gente pensará que es una cantidad de segundos, cuando en realidad es nano-segundo . Sugiero ver la respuesta de @brindy sobre cómo crear este número correctamente.1
adispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
porque conduce a la confusión. La gente podría pensar que no es necesario crear un dispatch_time_t en SwiftBinary operator '+' cannot be applied to operands of type DispatchTime and '_'
en la línealet delayTime = DispatchTime.now() + .seconds(1.0)
DispatchTime.now() + 1.0
parece ser la única forma de hacerlo funcionar (no es necesario.seconds
)Utilizo
dispatch_after
tantas veces que escribí una función de utilidad de nivel superior para simplificar la sintaxis:Y ahora puedes hablar así:
Wow, un idioma donde puedes mejorar el idioma. ¿Que podría ser mejor?
Actualización para Swift 3, Xcode 8 Seed 6
Parece que no vale la pena molestarse, ahora que han mejorado la sintaxis de llamadas:
fuente
func delayInSec(delay: Double) -> dispatch_time_t { return dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))) }
return
).1.0 ~~ { code...}
Swift 3+
Esto es súper fácil y elegante en Swift 3+:
Respuesta anterior:
Para ampliar la respuesta de Cezary, que se ejecutará después de 1 nanosegundo, tuve que hacer lo siguiente para ejecutar después de 4 segundos y medio.
Editar: descubrí que mi código original estaba ligeramente equivocado. La escritura implícita provoca un error de compilación si no convierte NSEC_PER_SEC en un Double.
Si alguien puede sugerir una solución más óptima, me gustaría escucharla.
fuente
dispatch_get_current_queue()
. Yo solía en sudispatch_get_main_queue()
lugar.dispatch_get_main_queue()
definitivamente es lo que deberías estar usando. Actualizará.la sintaxis de matt es muy buena y si necesita invalidar el bloque, puede usar esto:
Use de la siguiente manera
créditos
El enlace de arriba parece estar inactivo. Código Objc original de Github
fuente
performSelector:afterDelay:
ahora está disponible en Swift 2, por lo que puede cancelarlo.dispatch_source_t
, porque eso es algo que puede cancelar).La solución más simple en Swift 3.0 y Swift 4.0 y Swift 5.0
Uso
fuente
Apple tiene un fragmento de dispatch_after para Objective-C :
Aquí está el mismo fragmento portado a Swift 3:
fuente
Otra forma es extender Double así:
Entonces puedes usarlo así:
Me gusta la función de retraso de Matt, pero solo por preferencia, prefiero limitar los pases de cierre.
fuente
En Swift 3.0
Despacho de colas
Despacho después de 5 segundos
fuente
Versión Swift 3.0
Después de la función de cierre, ejecute alguna tarea después del retraso en el hilo principal.
Llame a esta función como:
fuente
1) Agregue este método como parte de la extensión UIViewController.
Llame a este método en VC:
2)
3)
// Forma compacta
fuente
Aunque no es la pregunta original del OP, ciertas
NSTimer
preguntas relacionadas se han marcado como duplicados de esta pregunta, por lo que vale la pena incluir unaNSTimer
respuesta aquí.NSTimer
vsdispatch_after
NSTimer
es más alto nivel mientras quedispatch_after
es más bajo nivel.NSTimer
Es más fácil de cancelar. Cancelardispatch_after
requiere escribir más código .Retrasar una tarea con
NSTimer
Crea una
NSTimer
instancia.Inicie el temporizador con el retraso que necesita.
Agregue una función que se llamará después del retraso (usando cualquier nombre que haya utilizado para el
selector
parámetro anterior).Notas
timer.invalidate()
.repeats: true
.Si tiene un evento único sin necesidad de cancelar, no es necesario crear la
timer
variable de instancia. Lo siguiente será suficiente:Vea mi respuesta más completa aquí .
fuente
Para múltiples funciones use esto. Es muy útil usar animaciones o el cargador de actividades para funciones estáticas o cualquier actualización de la interfaz de usuario.
Por ejemplo: use una animación antes de que se recargue una tableView. O cualquier otra actualización de la interfaz de usuario después de la animación.
fuente
Esto funcionó para mí.
Swift 3:
C objetivo:
fuente
Swift 3 y 4:
Puede crear una extensión en DispatchQueue y agregar un retraso de función que utilice la función DispatchQueue asyncAfter internamente
utilizar:
fuente
Otro ayudante para retrasar su código que es 100% rápido en el uso y opcionalmente permite elegir un hilo diferente para ejecutar su código retrasado desde:
Ahora simplemente retrasa su código en el hilo principal de esta manera:
Si desea retrasar su código a un hilo diferente :
Si prefiere un Framework que también tenga algunas características más útiles, entonces consulte HandySwift . Puede agregarlo a su proyecto a través de Carthage y luego usarlo exactamente como en los ejemplos anteriores, por ejemplo:
fuente
Siempre prefiero usar la extensión en lugar de las funciones gratuitas.
Swift 4
Use de la siguiente manera.
fuente
Retrasar la llamada GCD usando asyncAfter en Swift
Podemos retrasar como ** microsegundos , milisegundos , nanosegundos
fuente
En Swift 4
Usa este fragmento:
fuente
La
dispatch_after(_:_:_:)
función toma tres parámetros:La
dispatch_after(_:_:_:)
función invoca el bloque o cierre en la cola de despacho que se pasa a la función después de un retraso dado. Tenga en cuenta que el retraso se crea utilizando ladispatch_time(_:_:)
función. Recuerde esto porque también usamos esta función en Swift.Recomiendo pasar por el tutorial Raywenderlich Dispatch tutorial
fuente
En Swift 5, use en lo siguiente:
fuente
use este código para realizar alguna tarea relacionada con la interfaz de usuario después de 2.0 segundos.
Versión Swift 3.0
Después de la función de cierre, ejecute alguna tarea después del retraso en el hilo principal.
Llame a esta función como:
fuente
Ahora más que el azúcar sintáctico para despachos asincrónicos en Grand Central Dispatch (GCD) en Swift.
agregar Podfile
Entonces, puedes usarlo así.
fuente
Swift 4 tiene una forma bastante corta de hacer esto:
fuente
Aquí está la versión síncrona de asyncAfter en Swift:
Junto con uno asíncrono:
fuente