我使用Firebase(Swift)读取用户所属的组ID列表,然后循环访问ID以获取有关组的更多信息。与此类似的东西(伪代码):
// List the names of all Mary's groups
var ref = new Firebase("https://docs-examples.firebaseio.com/web/org");
// fetch a list of Mary's groups
ref.child("users/mchen/groups").on('child_added', function(snapshot) {
// for each group, fetch the name and print it
String groupKey = snapshot.key();
ref.child("groups/" + groupKey + "/name").once('value', function(snapshot) {
System.out.println("Mary is a member of this group: " + snapshot.val());
});
});
我怎么知道所有Firebase observeSingleEvent
都已执行,所以我可以在我的集合视图中重新加载数据。
编辑:
经过更多研究后,这看起来非常类似于question。我可以使用dispatch_group
或Bolts framework
编辑2:
感谢@appzYourLife的回答。我也能够使用RxSwift
来解决它。我只是用观察者包装Firebase调用并将它们保存在一个名为
Observable.zip(observables, { _ in }).subscribe(onCompleted: {
self.contentView.collection.reloadData() // do something here
})
答案 0 :(得分:11)
如果您希望在完成所有firebase调用后收到通知,可以使用此代码
let ref = FIRDatabase.database().reference()
ref.child("users/mchen/groups").observeSingleEvent(of: .value, with: { snapshot in
let groupKeys = snapshot.children.flatMap { $0 as? FIRDataSnapshot }.map { $0.key }
// This group will keep track of the number of blocks still pending
let group = DispatchGroup()
for groupKey in groupKeys {
group.enter()
ref.child("groups").child(groupKey).child("name").observeSingleEvent(of: .value, with: { snapshot in
print("Mary is a member of this group: \(snapshot.value)")
group.leave()
})
}
// We ask to be notified when every block left the group
group.notify(queue: .main) {
print("All callbacks are completed")
}
})
涉及4条主要指示。
首先,我们创建了一个组DispatchGroup()
。该值将跟踪待处理块的数量。
let group = DispatchGroup()
然后在开始新的异步调用之前,我们告诉该组有一个新的挂起块。
group.enter()
在回调闭包中,我们告诉小组一个块已完成其工作。
group.leave()
当进入组的块数变为零时,我们告诉块运行一个闭包。
group.notify(queue: .main) {
print("All callbacks are completed")
}
答案 1 :(得分:0)
您有组列表,因此您可以将计数存储在一个Int对象中。让我们说totalCount。
然后拿另一个对象。 让我们说吧。
然后在每个完成处理程序中。 在打印声明之后
ref.child("groups/" + groupKey + "/name").once('value', function(snapshot)
{
System.out.println("Mary is a member of this group: " + snapshot.val());
if counter == count
{
collectionView.reload();
}
else
{
counter += 1;
}
});