首页 > 解决方案 > 关于有限查询参考的 keepSynced(true) 的一些问题

问题描述

我有一个由 Firebase 支持的应用程序,其数据库结构如下:

posts
      /uid
           /postId

最初,我会使用with从posts/uid节点加载数据。这将同时为我的应用程序的所有用户频繁加载陈旧数据(每天约 5 次)。当尝试通过发布新帖子来更新数据时,Firebase 仍会返回过时的数据。ObserveEventOfType.childAdded

结果,我决定试一试keepSynced。现在,如果我的参考看起来像这样:

reference = Database().database.reference.child("posts").child(uid)

keepSynced将加载该节点上的所有数据,如果该节点中有许多子节点,这可能会导致非常大的下载量。因此,我决定将参考/查询更改为:

reference = Database().database.reference.child("posts").child(uid).queryLimited(toLast: 25)

keepSynced为该节点打开时,它会成功同步该节点中的最后 25 个子节点。但是,我仍然面临相当频繁地接收陈旧数据的问题。所以这是我的问题:

  1. 在有限查询上添加keepSynced模式时,它是仅从您添加到的初始节点同步,还是始终只同步该节点下的 25 个最新子节点?

  2. 在代码中添加行的最佳位置在哪里keepSynced(true)?在我们加载引用之前,在viewWillAppear实际下载回调中,还是在里面?

  3. 同样,最好的使用地点在keepSynced(false)哪里?

  4. keepSynced当应用程序淡入后台时,侦听器会删除吗?

  5. 为什么keepSynced有时不解决子更新?

我目前keepSynced(true)在用于加载调用的帖子的函数内部使用viewDidLoad.

提前致谢。

标签: iosswiftfirebasecachingfirebase-realtime-database

解决方案


顾名思义keepSynced(true),您调用的任何查询或引用都会在本地缓存中保持同步。它实际上只是将一个空观察者附加到该查询/引用。所以在你的Database().database.reference.child("posts").child(uid).queryLimited(toLast: 25)它将同步最后 25 个子节点,并继续同步那些(删除以前的,因为添加了新的)。

如果您重复侦听完全相同的数据,Firebase 实时数据库缓存机制最可靠。具体来说,.value附加到的侦听器Database().database.reference.child("posts").child(uid)可能看不到通过 缓存的数据Database().database.reference.child("posts").child(uid).queryLimited(toLast: 25)。这是因为 Firebase 客户端保证永远不会为部分更新触发事件,并且在此示例中,它不能保证它具有来自第一个引用的所有数据。

对于您的问题:

  1. 看上面...

  2. 最常见的是将它们添加到viewWillAppear.

  3. 我不知道你为什么要打电话keepSynced假,所以不能在那里推荐任何东西。

  4. 不确定这是否是您的意思,但keepSynced(true)在应用程序运行之间不会持续存在。keepSynced(true)因此,每次您的应用程序/视图启动时,您都必须调用。

  5. 看上面...

一般来说,您似乎通过以不同方式调用 API 来尝试解决 API 的工作方式。我通常不会从中看到很好的结果。如果您希望您的应用程序的行为与 API 不同,请考虑创建自定义包装器,并在其中缓存数据。


推荐阅读