Dif*_*hen 3 firebase swift firebase-realtime-database
在 Swift 5 中从 Firebase 获取所有添加的子项后,如何执行一些代码?
我尝试过使用 DispatchGroup 并观察 .value,但它们都没有有效地工作。
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
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,代码将在获取数据之前执行。
当只有回调块到达最后一个子节点时,如何执行代码?
一种选择是利用在 .childAdded 函数之后调用 Firebase .value 函数。
这意味着 .childAdded 将迭代所有 childNode,然后在读取最后一个 childNode 后,将调用任何 .value 函数。
假设我们想要迭代用户节点中的所有用户,打印他们的名字,并在打印最后一个用户名后,输出一条所有用户都已读入的消息。
从简单的结构开始
users
uid_0
name: "Jim"
uid_1
name: "Spock"
uid_2
name: "Bones"
Run Code Online (Sandbox Code Playgroud)
然后一次读取一个用户的代码打印他们的名字,然后在读取所有名字后输出到控制台
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
})
}
Run Code Online (Sandbox Code Playgroud)
和输出
Jim
Spock
Bones
--inital load has completed and the last user was read--
Run Code Online (Sandbox Code Playgroud)
请注意,这将在用户节点上留下一个观察者,因此如果添加新用户,它也会打印他们的名字。
Note 注意: self.ref 指向我的 root firebase 引用。
| 归档时间: |
|
| 查看次数: |
881 次 |
| 最近记录: |