在Firebase数据库中,如何阅读大型列表,然后有效地获取子更新

时间:2018-03-25 21:38:34

标签: performance list firebase firebase-realtime-database updates

我想尽快从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#,但我确定其他平台的问题相同)

1 个答案:

答案 0 :(得分:0)

value侦听器和child_侦听器的有线流量完全相同。这些事件纯粹是客户端对底层数据的解释。

如果您需要所有孩子,请考虑仅使用child_*听众而不使用pathRef.ObserveSingleEvent(DataEventType.Value。这将导致最简单的代码。