首页 > 解决方案 > 许多 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节点的整个快照,这可能非常大。

标签: iosfirebasefirebase-realtime-database

解决方案


只要您将侦听器附加到某个位置,Firebase 就会尽最大努力提供写入该侦听器的所有数据。如果您不想要所有这些更新,则不应将侦听器附加到该位置。

如果您有一个每秒获取数千次更新的位置,请考虑设置一个仅获取该数据的摘要版本的辅助位置。然后,您的常规客户可以收听具有更合理更新频率的次要位置,并且您只需要一个侦听器即可收听高速更新的位置。


从评论看来,您似乎在询问 Firebase 客户端是否保留它曾经收到的所有旧数据。情况并非如此:Firebase 仅保留从服务器接收到的每个节点的最新快照。它确实保留了在此客户端上进行且尚未发送到服务器的本地写入队列,但是如果在与服务器的连接之间发生大量写入,这只会显着影响内存使用。


推荐阅读