我想尽快从Firebase数据库中加载5000个项目,然后在添加或更改子项时获取任何更新。
到目前为止,我的方法是使用ObserveSingleEvent在启动时加载整个列表
pathRef.ObserveSingleEvent(DataEventType.Value, (snapshot) =>
当它完成后,使用ObserveEvent进行子更改和添加:
nuint observerHandle1 = pathRef.ObserveEvent(DataEventType.ChildChanged, (snapshot) =>
nuint observerHandle2 = pathRef.ObserveEvent(DataEventType.ChildAdded, (snapshot) =>
问题是ChildAdded事件被触发了5000次,所有这些都是不必要的,并且需要很长时间才能完成。 (来自文档:" child_added为每个现有子项触发一次,然后每次将新子项添加到指定路径时再次触发)
我不能忽略每个孩子的第一次更新,因为它可能是真正的改变(例如,在完成ObserveSingleEvent之后更新数据库)。 所以我必须检查客户端上的每个项目,看看它是否已经改变。这一切都非常缓慢且效率低下。
我发过帖子建议使用LimitToLast等查询,但这不可靠,因为可能会错过子项更改。
我的计划B是不做ObserveSingleEvent来加载列表而只依赖于5000个孩子添加的调用,但这看起来很疯狂并且最初获取列表的速度较慢,并且可能使用了更多用户的数据津贴。
我认为这是一种常见的情况,那么最佳解决方案是什么?
此外,我启用了持久性,因此有几个相关的问题:
1)如果之前加载了整个列表,带有Value的ObserveSingleEvent是否只是从磁盘加载而没有网络使用,在线时(但自上次下载后没有发生任何变化)或是否下载了整个再次列出?
2)类似于添加了5000个对孩子的调用 - 如果它全部在磁盘上,是否有网络使用,如果没有更改则在线?
(我在iOS上使用C#,但我确定其他平台的问题相同)
答案 0 :(得分:0)
value
侦听器和child_
侦听器的有线流量完全相同。这些事件纯粹是客户端对底层数据的解释。
如果您需要所有孩子,请考虑仅使用child_*
听众而不使用pathRef.ObserveSingleEvent(DataEventType.Value
。这将导致最简单的代码。