Après avoir lu Swift 3 évolution sur GCD, j'essaie de créer un groupe de répartition. Le problème est le group.notify(queue:
ne préviens pas quand je passe DispatchQueue.main
en tant que file d'attente, bien que cela fonctionne pour la file d'attente en arrière-plan.
De plus, je ne suis pas sûr que ma syntaxe soit correcte, car j'essaie de convertir le code de Swift 2 à Swift 3.
typealias CallBack = (result: Bool) -> Void
func longCalculations (completion: CallBack) {
let backgroundQ = DispatchQueue.global(attributes: .qosBackground)
let group = DispatchGroup()
var fill:[Int] = []
for item in 0...200 {
group.enter()
if item > 50 {
fill.append(item)
}
group.leave()
}
//Below in the notify argument If I pass `backgroundQ`, it seems to work correctly but not when DispatchQueue.main is passed.
Ce code ne fonctionne pas
group.notify(queue: DispatchQueue.main, execute: {
completion(result: true)
})
}
Cela fonctionne correctement
group.notify(queue: backgroundQ, execute: {
completion(result: true)
})
}
_______________________________________________________
longCalculations() { print($0) }
Après avoir lu le post suggéré par Matt, j'ai trouvé que je soumettais la tâche à la file d'attente principale et quand j'ai demandé à être notifié sur le thread principal lui-même, il s'est retrouvé dans l'impasse.
J'ai modifié le code et maintenant il fonctionne comme prévu,
typealias CallBack = (result: [Int]) -> Void
func longCalculations (completion: CallBack) {
let backgroundQ = DispatchQueue.global(attributes: .qosDefault)
let group = DispatchGroup()
var fill:[Int] = []
for number in 0..<100 {
group.enter()
backgroundQ.async(group: group, execute: {
if number > 50 {
fill.append(number)
}
group.leave()
})
}
group.notify(queue: DispatchQueue.main, execute: {
print("All Done"); completion(result: fill)
})
}
longCalculations(){print($0)}