Dans Swift 3, il n'y a pas besoin de gestionnaire d'achèvement lorsque DispatchQueue
termine une tâche. En outre, vous pouvez atteindre votre objectif de différentes manières
Une façon est la suivante.
var a: Int?
let queue = DispatchQueue(label: "com.app.queue")
queue.sync {
for i in 0..<10 {
print("Ⓜ️" , i)
a = i
}
}
print("After Queue \(a)")
Il attendra jusqu'à ce que la boucle se termine, mais dans ce cas votre thread de messagerie se bloquera.
Vous pouvez également faire cette même chose comme
let myGroup = DispatchGroup()
myGroup.enter()
//// Do your task
myGroup.leave() //// When your task completes
myGroup.notify(queue: DispatchQueue.main) {
////// do your remaining work
}
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 comment utiliser DispatchWorkItem
let workItem = DispatchWorkItem {
// Do something
}
let queue = DispatchQueue.global()
queue.async {
workItem.perform()
}
workItem.notify(queue: DispatchQueue.main) {
// Here you can notify you Main thread
}
Je veux exécuter une fonction dans une autre classe mais je veux attendre pour terminer cette fonction et puis dans la classe actuelle continuer comment puis-je gérer cela? –
@SaeedRahmatolahi: utilisez l'approche wait (si vous ne bloquez pas le problème, 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 d'appel. – shallowThought
Pourquoi appelez-vous 'group.enter' en dehors du bloc asynchrone? Ne devrait-il pas être de la responsabilité de chaque groupe d'entrer et de quitter le groupe? – Bill