¿Cómo puedo hacer que mi código espere hasta que finalice la tarea en DispatchQueue? ¿Necesita CompletionHandler o algo así?
func myFunction() {
var a: Int?
DispatchQueue.main.async {
var b: Int = 3
a = b
}
// wait until the task finishes, then print
print(a) // - this will contain nil, of course, because it
// will execute before the code above
}
Estoy usando Xcode 8.2 y escribiendo en Swift 3.
swift
multithreading
asynchronous
swift3
grand-central-dispatch
Bartosz Woźniak
fuente
fuente
wait
enfoque (si no es un problema para usted bloquear, es decir, si no está en el hilo principal) o proporcione un controlador de finalización o use el enfoque de notificación en su clase de llamada.group.enter
fuera del bloque asincrónico? ¿No debería ser responsabilidad de cada bloque entrar y salir del grupo?wait
espera hastaenter
yleave
llamadas están equilibradas. Si pusieraenter
en el cierre,wait
no esperaría porqueenter
aún no ha sido llamado y por lo tanto el número de llamadasenter
y está balanceado (# enter == 0, # leav == 0).leave
XCTTestExpectation
s en su lugar. Vea este código de muestraEn Swift 3, no hay necesidad de un controlador de finalización cuando
DispatchQueue
finaliza una tarea. Además puedes lograr tu objetivo de diferentes formasUna forma es esta:
Esperará hasta que finalice el ciclo, pero en este caso su hilo principal se bloqueará.
También puedes hacer lo mismo como esto:
Una última cosa: si desea usar completeHandler cuando su tarea se complete usando DispatchQueue, puede usar
DispatchWorkItem
.A continuación, se muestra un ejemplo de cómo utilizarlo
DispatchWorkItem
:fuente
Usar grupo de despacho
fuente
DispatchQueue.global().async{}
no bloqueará la cola principal.Versión Swift 5 de la solución
func myCriticalFunction () {var value1: String? var value2: String?
}
fuente
Rápido 4
Puede utilizar la función Async para estas situaciones. Cuando lo usa
DispatchGroup()
, a veces puede ocurrir un interbloqueo .fuente