Swift 5,从Firebase获取所有添加的子项后如何执行代码
在Swift 5中获取从Firebase添加的所有childadded后,如何执行一些代码 我尝试过使用DispatchGroup和observe.value,但没有一个有效Swift 5,从Firebase获取所有添加的子项后如何执行代码,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,在Swift 5中获取从Firebase添加的所有childadded后,如何执行一些代码 我尝试过使用DispatchGroup和observe.value,但没有一个有效 let dispatchGroup = DispachGroup() ref.child("path").observe(.childAdded, with: { (snapshot) in self.dispatchGroup.enter() //store snapshot data into a
let dispatchGroup = DispachGroup()
ref.child("path").observe(.childAdded, with: { (snapshot) in
self.dispatchGroup.enter()
//store snapshot data into an object
self.dispatchGroup.leave()
})
dispatchGroup.notify(queue: .main) {
//code to execute after all children are fetched
}
在这种情况下,代码将在获取数据之前执行
当只有回调块到达最后一个子级时,我如何执行代码?当您在侦听时。childAdded,当您的代码被最后一个子级调用时,无法执行代码。因此,如果必须区别对待最后一个子函数,请侦听.value并在子函数上循环,如图所示。一个选项是利用Firebase.value函数在.childAdded函数之后调用 这意味着.childAdded将迭代所有childNode,然后在读取最后一个childNode后,将调用任何.value函数 假设我们要迭代用户节点中的所有用户,打印他们的姓名,在打印最后一个用户名后,输出一条所有用户都已读入的消息 从一个简单的结构开始
users
uid_0
name: "Jim"
uid_1
name: "Spock"
uid_2
name: "Bones"
然后,一次读取一个用户的代码,打印出他们的名字,然后在读取完所有名字后输出到控制台
var initialRead = true
func readTheUsers() {
let usersRef = self.ref.child("users")
usersRef.observe(.childAdded, with: { snapshot in
let userName = snapshot.childSnapshot(forPath: "name").value as? String ?? "no name"
print(userName)
if self.initialRead == false {
print("a new user was added")
}
})
usersRef.observeSingleEvent(of: .value, with: { snapshot in
print("--inital load has completed and the last user was read--")
self.initialRead = false
})
}
以及输出
Jim
Spock
Bones
--inital load has completed and the last user was read--
注意,这将在用户节点上留下一个观察者,因此如果添加了新用户,它也将打印他们的姓名
注:self.ref指向我的根firebase引用。我认为我的答案将满足OP的要求-仔细检查我的逻辑:-是的。这是我描述的逻辑的一个很好的实现。向上投票!这两件事不会同时发生吗?第二个ObserveSingEvent必须等待第一个ObserveSingEvent的原因是什么。我理解.value在.childAdded完成后激发,但我不理解为什么,因为它们是两个完全不同的操作,一个如何知道另一个。我想到的唯一一件事是,它们都使用相同的用户。如果master ref确定了顺序,但仍然不清楚等待的是什么。Samaria,它们不是同时发生的,这是整个过程的基础。值事件总是在.childxxx事件之后调用。你可以在这里读到一些关于这一点的信息——它在管理部分,但适用于所有领域。我理解这一部分,只是奇怪的是,两个不同的流程彼此都不知道。真奇怪。感谢链接,一个选项是利用Firebase.value函数在.childAdded函数之后调用@杰伊:今天最好的发现!谢谢