完成处理程序问题
Completion handler problems
我有一个方法,我想在准备就绪后得到 return 结果。但我正在为 2 个完成处理程序而苦苦挣扎。
这是代码。第一个完成处理程序是 members.observesingleEvent。这 returns 来自数据库的一些键。然后我遍历键以从另一个调用中获取新值。我遍历这些值并进行另一个调用。
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)
}
})
我有一个方法,我想在准备就绪后得到 return 结果。但我正在为 2 个完成处理程序而苦苦挣扎。
这是代码。第一个完成处理程序是 members.observesingleEvent。这 returns 来自数据库的一些键。然后我遍历键以从另一个调用中获取新值。我遍历这些值并进行另一个调用。
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)
}
})