ios - 许多 firebase 实时更新的内存影响
问题描述
在我的 iOS 应用程序中,我有一个连接到 firebase 实时数据库端点的侦听器,用于侦听我的应用程序用户发布的聊天消息。在一小时内,可能有数万条消息发布到此端点。在我的应用程序上,我最多每秒只显示一条消息,并丢弃在显示时进入的其他消息。我知道 firebase 会为通过侦听器传入的数据创建缓存,那么它会缓存数千条从未在 iOS 应用程序中显示的消息吗?如果是这样,我该如何阻止这种情况?
更新以回应弗兰克的回答:
Firebase 仅保留从服务器接收到的每个节点的最新快照
我遇到的问题是我在数据库节点存储和收听聊天消息events/{eventId}/chat
。我是这样听的:
let query = rtdb.child(withPath: "events/{eventId}/chat")
.queryOrdered(byChildKey: "createdAt")
query.observe(.childAdded, with: { snapshot in
// callback here
})
对我来说发生的事情是,每当在数据库中的同一节点调用此侦听器时,它首先会返回它曾经从该节点接收到的所有数据,然后侦听来自数据库节点的更新。从您的回答来看这是有道理的,因为它正在返回events/{eventId}/chat
节点的缓存。
我必须将此添加到查询中,以仅从数据库返回更新而没有缓存数据:
.queryStarting(at: Int(Date().timeIntervalSince1970*1000))
即使我查询的是.childAdded
事件而不是.value
事件,它是否应该这样做?这似乎确实存在内存问题,因为它正在存储该events/{eventId}/chat
节点的整个快照,这可能非常大。
解决方案
只要您将侦听器附加到某个位置,Firebase 就会尽最大努力提供写入该侦听器的所有数据。如果您不想要所有这些更新,则不应将侦听器附加到该位置。
如果您有一个每秒获取数千次更新的位置,请考虑设置一个仅获取该数据的摘要版本的辅助位置。然后,您的常规客户可以收听具有更合理更新频率的次要位置,并且您只需要一个侦听器即可收听高速更新的位置。
从评论看来,您似乎在询问 Firebase 客户端是否保留它曾经收到的所有旧数据。情况并非如此:Firebase 仅保留从服务器接收到的每个节点的最新快照。它确实保留了在此客户端上进行且尚未发送到服务器的本地写入队列,但是如果在与服务器的连接之间发生大量写入,这只会显着影响内存使用。
推荐阅读
- reactjs - 传递给父级时,接口中缺少属性
- java - Spring boot 测试失败,仅对 Repository 类的依赖关系不满足
- java - 页面工厂在 Selenium 中返回 null
- azure-devops-rest-api - 如何使用 ADO Rest API 获取特定构建中的测试运行列表
- google-chrome - 使用自定义/外部协议可能导致此 Chrome 安全警告的原因是什么?
- c++ - 如何使用模板自定义容器重载 ostream_iterator?
- excel - 使用给定列表查找和替换宏,保持格式化
- c# - 有没有办法使用c#从源代码复制最新的文件和文件夹(对新创建的文件和文件夹进行排序)?
- python-3.x - 我正在尝试使用 texblob 翻译器将 .csv 文件翻译成英文,但出现以下错误
- python - 如何在 selenium 自动保存谷歌搜索中的第一个链接?