2017-02-01 5 views
0

Я общался с группами отправки и задаюсь вопросом, как повлияет на размещение обратного вызова уведомления группы отправки, когда будет вызван обратный вызов. Я читаю данные из своей базы данных, а затем получаю изображение для каждого элемента в прочитанных данных. Когда у меня есть уведомление за пределами исходного блока чтения базы данных, я замечаю, что он вызывается немедленно, однако, когда уведомление внутри блока, он ведет себя надлежащим образом. Вот мой код:Отправка группы уведомлений?

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() 
       }) 
      } 
     }) 
    } 

Этот код ведет себя правильно, когда уведомление находится в исходном блоке чтения базы данных. Однако, если я поместил это после блока ref.observeSingleEvent, уведомление будет вызвано немедленно.

Может кто-нибудь, пожалуйста, объясните мне это?

+0

Если у вас есть за пределами блока, то уведомляют получает достигнуто до любой достигнуты ваши вызовы 'self.dispatchGroup.enter()'. – dan

ответ

1

Да. Асинхронный код :-)

исполнения кода проходит весь путь до конца функции, а затем обработчик завершения будет называться