【发布时间】:2018-03-25 21:38:34
【问题描述】:
我想尽快从 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#,但我确信其他平台也有同样的问题)
【问题讨论】:
-
如果您需要所有子级,则考虑仅使用
child_*侦听器而不使用pathRef.ObserveSingleEvent(DataEventType.Value。它将导致最简单的代码。 -
是的,那是我的 B 计划,但是当数据还没有在磁盘上时,一次从 Internet 加载每个项目可能比使用类型 Value 慢得多并且使用更多的数据余量(它用于手机应用)
-
value侦听器和child_侦听器的有线流量完全相同。这些事件纯粹是对基础数据的客户端解释。
标签: performance list firebase firebase-realtime-database updates