Como posso fazer meu código esperar até que a tarefa no DispatchQueue seja concluída? Ele precisa de algum CompletionHandler ou algo assim?
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
}
Estou usando o Xcode 8.2 e escrevendo em Swift 3.
swift
multithreading
asynchronous
swift3
grand-central-dispatch
Bartosz Woźniak
fonte
fonte
wait
abordagem (se não for problema para você bloquear, ou seja, se você não estiver no thread principal) ou forneça um manipulador de conclusão ou use a abordagem de notificação em sua classe de chamada.group.enter
fora do bloco assíncrono? Não deveria ser responsabilidade de cada bloco entrar e sair do grupo?wait
espera atéenter
eleave
chamadas são equilibradas. Se você colocarenter
no fechamento,wait
não esperaria porqueenter
ainda não foi chamado e, portanto, o número de chamadasenter
e está balanceado (# enter == 0, # leav == 0).leave
XCTTestExpectation
vez disso, use s. Veja este código de amostraNo Swift 3, não há necessidade de manipulador de conclusão quando
DispatchQueue
terminar uma tarefa. Além disso, você pode atingir seu objetivo de maneiras diferentesUma maneira é esta:
Ele esperará até que o loop termine, mas neste caso seu thread principal será bloqueado.
Você também pode fazer a mesma coisa assim:
Uma última coisa: se você deseja usar a conclusãoHandler quando sua tarefa for concluída usando o DispatchQueue, você pode usar
DispatchWorkItem
.Aqui está um exemplo de como usar
DispatchWorkItem
:fonte
Usar grupo de despacho
fonte
DispatchQueue.global().async{}
não bloqueará a fila principal.Versão Swift 5 da solução
função myCriticalFunction () {var value1: String? var value2: String?
}
fonte
Swift 4
Você pode usar a função assíncrona para essas situações. Quando você usa
DispatchGroup()
, às vezes pode ocorrer um deadlock .fonte