【发布时间】:2020-09-26 21:53:12
【问题描述】:
运行 Firebase 闭包,例如:
databaseRef.observe(.childAdded) { (snapshot) in
...
}
第一次运行时,它会去获取数据,并且在添加数据时也会执行它的闭包。这是应该的。然而,当你第一次触发这个方法,并且没有数据要获取时,闭包永远不会返回。这样就无法判断是否没有数据,或者是否还没有获得所有数据。如果没有关闭触发,我们无法查看snapshot 以查看它是否为exists。
鉴于文档表明您可以查询快照以查看它是否存在或值是否为 nil,因此必须有一种方法可以在最初被回调。再次添加的后续数据将回调此闭包,如果最初有数据,则该闭包将返回。
如果没有数据,我在获取初始回调时缺少什么?
更新:
提供一个有效的解决方案,该解决方案未在给出的链接中提供,表明这是重复的。这个问题的原因——弗兰克在这里和他提供的线程链接中完美地回答了——是由于.childAdded 的工作方式。 Frank 指出,可以在同一个查询中同时调用.value 和.childAdded,初始数据不会被加载两次。基于这些关键信息,我开始通过以下方式处理此问题:
databaseRef.observeSingleEvent(.value, with: { (valueSnapshot) in
if !valueSnapshot.exists() {
[do stuff based on the absence of data]
}
databaseRef.observe(.childAdded) { (childSnapshot) in
[do stuff based on children present and when children added]
}
}
外部事件只会触发一次。内部事件将被设置为侦听器,因此将来添加的子事件将仅在其闭包内执行。
【问题讨论】:
标签: swift firebase firebase-realtime-database