¿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

waitenfoque (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.enterfuera del bloque asincrónico? ¿No debería ser responsabilidad de cada bloque entrar y salir del grupo?waitespera hastaenteryleavellamadas están equilibradas. Si pusieraenteren el cierre,waitno esperaría porqueenteraún no ha sido llamado y por lo tanto el número de llamadasentery está balanceado (# enter == 0, # leav == 0).leaveXCTTestExpectations en su lugar. Vea este código de muestraEn Swift 3, no hay necesidad de un controlador de finalización cuando
DispatchQueuefinaliza 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