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