2017-02-01 2 views
0

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?

+0

Si vous avez en dehors du bloc alors notify obtient atteint avant tout de vos appels à 'self.dispatchGroup.enter()' sont atteints. – dan

Répondre

1

Oui. code asynchrone :-)

exécution de code

court tout le chemin jusqu'à la fin de la fonction, et puis le gestionnaire d'achèvement sera appelé