ios - 关于有限查询参考的 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 个子节点。但是,我仍然面临相当频繁地接收陈旧数据的问题。所以这是我的问题:
在有限查询上添加
keepSynced
模式时,它是仅从您添加到的初始节点同步,还是始终只同步该节点下的 25 个最新子节点?在代码中添加行的最佳位置在哪里
keepSynced(true)
?在我们加载引用之前,在viewWillAppear
实际下载回调中,还是在里面?同样,最好的使用地点在
keepSynced(false)
哪里?keepSynced
当应用程序淡入后台时,侦听器会删除吗?为什么
keepSynced
有时不解决子更新?
我目前keepSynced(true)
在用于加载调用的帖子的函数内部使用viewDidLoad
.
提前致谢。
解决方案
顾名思义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 客户端保证永远不会为部分更新触发事件,并且在此示例中,它不能保证它具有来自第一个引用的所有数据。
对于您的问题:
看上面...
最常见的是将它们添加到
viewWillAppear
.我不知道你为什么要打电话
keepSynced
假,所以不能在那里推荐任何东西。不确定这是否是您的意思,但
keepSynced(true)
在应用程序运行之间不会持续存在。keepSynced(true)
因此,每次您的应用程序/视图启动时,您都必须调用。看上面...
一般来说,您似乎通过以不同方式调用 API 来尝试解决 API 的工作方式。我通常不会从中看到很好的结果。如果您希望您的应用程序的行为与 API 不同,请考虑创建自定义包装器,并在其中缓存数据。
推荐阅读
- reactjs - 根据每个 id 点击编辑 React 功能组件弹出窗口
- ios - Swift 5 - 根据键将变量设置为 plist 值
- sql - 如何使用存储过程从 t-sql 表中现有的两列计算一列的值?
- javascript - 在 IE 浏览器中填充下拉值
- svelte - sveltejs/kit 不接受“npm run start”
- c - 从函数写入时,链表状态保持不变
- django - 如何配置 Django(在 docker 上)通过 Postfix 发送邮件
- sql - 每组不同的 SQL 计数除以总数的不同计数
- python - `id()` 返回的值有什么限制
- node.js - 身份验证后如何重定向到变量链接?