完成处理程序问题

问题描述:

我有一个方法,当它准备好时要返回结果。但我正在与2个完成处理程序挣扎。完成处理程序问题

这是代码。第一个完成处理程序是members.observesingleEvent。这将从数据库中返回一些键。然后我循环访问键以从另一个调用中获取新值。我循环的值,并做另一个电话。

private func getRoomDevices(completionHandler : @escaping (Bool) ->()){ 


members.observeSingleEvent(of: .value, with: { snapshot in 
    if !snapshot.exists() { return } 

    let postDict = snapshot.value as! [String : AnyObject] 

    for list in postDict { 
     self.ref.child("groups/" + list.key).observeSingleEvent(of: .value, with: { groups in 
      self.rooms.append(FirebaseApi().convertRoomDevices(snap: groups)) 
      print(groups.debugDescription) 


     }); 
    } 

    completionHandler(true) 

}) 

我把所有东西加到房间数组中。但是会发生什么情况是for循环繁忙时调用completionHandler(true)。 completionHandler需要在所有事情完成时调用。

您必须使用DispatchGroup,您可以在其中添加异步循环中的所有项目,并且只有在组的所有项目完成执行时才调用完成处理程序。

members.observeSingleEvent(of: .value, with: { snapshot in 
    if !snapshot.exists() { return } 

    let postDict = snapshot.value as! [String : AnyObject] 
    let group = DispatchGroup() 
    for list in postDict { 
     group.enter() 
     self.ref.child("groups/" + list.key).observeSingleEvent(of: .value, with: { groups in 
      self.rooms.append(FirebaseApi().convertRoomDevices(snap: groups)) 
      print(groups.debugDescription) 
      group.leave() 
     }); 
    } 
    group.notify(queue: DispatchQueue.main) { 
     completion(true) 
    } 

})