Dans mon exemple de code ci-dessous, j'appelle complete(false)
en cas d'échec. Cependant, depuis que je suis sur un objet DispatchGroup
pour vous assurer que toutes les requêtes asynchrones soient terminées, je ne peux pas appeler syncGroup.leave()
en cas d'échec, comme notify
sera appelée, qui contient complete(true)
, ce qui en retour de la fonction true
, quand il devrait être de retour false
pour l'échec.Comment utiliser DispatchGroup pour effectuer des appels asynchrones dans une boucle for
Ai-je raison de ne pas appeler syncGroup.leave()
si la fonction n'a pas été exécutée correctement? Ou devrais-je appeler syncGroup.leave()
et d'une certaine manière en essayant de déterminer ce que le résultat est, afin que je puisse retourner false
en cas d'échec?
let syncGroup = DispatchGroup()
syncGroup.enter()
for track in unsynced {
register(time: time, withCompletion: { (success: Bool) ->() in
if success {
self.debug.log(tag: "SyncController", content: "Registered")
syncGroup.leave()
}
else {
complete(false)
}
})
}
//all requests complete
syncGroup.notify(queue: .main) {
self.debug.log(tag: "SyncController", content: "Finished registering")
complete(true)
}
Votre approche est erronée puisque vous dispatching de nombreuses tâches, mais seulement le retour d'un statut unique. Vous devez considérer ce que vous voulez accomplir; Vous devriez peut-être être prêt à recevoir plusieurs rappels (en passant peut-être le 'track' ainsi que le résultat true/false) ou appeler le callback une fois mais passer un tableau de pistes/statuts – Paulw11