Comment puis-je faire attendre mon code jusqu'à la fin de la tâche dans DispatchQueue? A-t-il besoin de CompletionHandler ou de quelque chose?
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
}
J'utilise Xcode 8.2 et j'écris dans Swift 3.
swift
multithreading
asynchronous
swift3
grand-central-dispatch
Bartosz Woźniak
la source
la source
wait
approche (si ce n'est pas un problème pour vous de bloquer, c'est-à-dire si vous n'êtes pas sur le thread principal) ou fournissez un gestionnaire d'achèvement ou utilisez l'approche notify dans votre classe appelante.group.enter
dehors du bloc asynchrone? Ne devrait-il pas être de la responsabilité de chaque bloc d'entrer et de sortir du groupe?wait
attendenter
et lesleave
appels sont équilibrés. Si vous mettezenter
dans la fermeture,wait
n'attendrait pas carenter
n'a pas encore été appelé et donc le nombre d' appelsenter
et sont équilibrés (# enter == 0, # leav == 0).leave
XCTTestExpectation
plutôt s. Voir cet exemple de codeDans Swift 3, il n'y a pas besoin de gestionnaire d'achèvement lorsque vous avez
DispatchQueue
terminé une tâche. De plus, vous pouvez atteindre votre objectif de différentes manièresUne façon est la suivante:
Il attendra la fin de la boucle, mais dans ce cas, votre thread principal se bloquera.
Vous pouvez également faire la même chose comme ceci:
Une dernière chose: si vous souhaitez utiliser completionHandler lorsque votre tâche se termine à l'aide de DispatchQueue, vous pouvez utiliser
DispatchWorkItem
.Voici un exemple d'utilisation
DispatchWorkItem
:la source
Utiliser le groupe d'expédition
la source
DispatchQueue.global().async{}
ne bloquera pas la file d'attente principale.Version Swift 5 de la solution
func myCriticalFunction () {var value1: String? var valeur2: Chaîne?
}
la source
Swift 4
Vous pouvez utiliser la fonction Async dans ces situations. Lorsque vous utilisez
DispatchGroup()
, un blocage peut parfois se produire.la source