J'ai été déconner avec des groupes de répartition et je me demande comment le placement du rappel de notification d'un groupe de répartition affecte lorsque le rappel sera appelé. Je lis des données de ma base de données et récupère une image pour chaque élément dans les données qui ont été lues. Quand j'ai le notifier en dehors du bloc de lecture de la base de données initiale, je remarque qu'il est appelé immédiatement, mais quand le notificateur est à l'intérieur du bloc, il se comporte correctement. Voici mon code:Dispatch Group notifier le placement?
override func viewDidAppear(_ animated: Bool) {
let ref = FIRDatabase.database().reference().child("users").child((FIRAuth.auth()?.currentUser?.uid)!).child("invites")
ref.observeSingleEvent(of: .value, with: { snapshot in
if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {
for child in snapshots {
self.dispatchGroup.enter()
let info = petInfo(petName: child.value! as! String, dbName: child.key)
print(info)
self.invitesData[info] = UIImage()
let picRef = FIRStorage.storage().reference().child("profile_images").child(info.dbName+".png")
picRef.data(withMaxSize: 1024 * 1024) { (data, error) -> Void in
if error != nil {
print(error?.localizedDescription ?? "Error getting picture")
}
// Create a UIImage, add it to the array
self.invitesData[info] = UIImage(data: data!)!
self.dispatchGroup.leave()
}
}
self.dispatchGroup.notify(queue: DispatchQueue.main, execute: {
print("YOOO")
self.invitesArray = Array(self.invitesData.keys)
print(self.invitesArray)
self.inviteTable.reloadData()
})
}
})
}
Ce code se comporte correctement lorsque la notification est dans le bloc de lecture de base de données d'origine. Cependant si je place ceci après le bloc ref.observeSingleEvent
le notifier est appelé immédiatement.
Quelqu'un peut-il m'expliquer cela?
Si vous avez en dehors du bloc alors notify obtient atteint avant tout de vos appels à 'self.dispatchGroup.enter()' sont atteints. – dan