我想读取一个节点的所有子节点,然后跟踪之后发生的任何更改。一个用例可能是本地缓存,我想推迟使用缓存,直到我知道它已填充。
我可以想象的一种方法是首先调用Query.addListenerForSingleValueEvent()
来获取初始状态。获得结果后,我知道我的本地缓存已填充,现在可以调用Query.addChildEventListener()
以获取有关何时添加和删除子项的更新。
但是,这似乎效率低下 - 现在整个子列表正在通过网络发送两次,我需要添加一个检查以跳过来自我已经从addListenerForSingleValueEvent()
获得的addChildEventListener()
的条目。
这没什么大不了的,但我想知道是否有更好的方法 - 难道没有一种方法可以简单地调用addChildEventListener()
并在发送所有条目时获得信号吗?
要开始同步数据并知道初始同步何时完成,您需要添加两个侦听器。
- 处理实际更新的
ChildEventListener
。 - 用于检测何时发送完整更新的
ValueEventListener
。
对于数据库中的初始数据,将首先为每个子节点调用您的ChildEventListener.onChildAdded
。之后,将调用ValueEventListener.onDataChange
。
因此,一旦调用onDataChange
,您就可以知道所有初始数据都已加载。如果您只关心此初始数据是否完整,则可以向addSingleValueEventListener
注册此侦听器,以便在初始同步后分离。
请注意,Firebase 只会传输一次数据,即使该数据有多个侦听器也是如此。因此,如果将两个侦听器连接到同一位置,则只会读取一次数据。