在 Firebase 中启用持久性后实际会发生啥?

Posted

技术标签:

【中文标题】在 Firebase 中启用持久性后实际会发生啥?【英文标题】:What actually happens when persistence is enabled in Firebase?在 Firebase 中启用持久性后实际会发生什么? 【发布时间】:2016-09-13 13:49:13 【问题描述】:

ios 中为 Firebase 启用持久性时,我的观察者实际发生了什么以及他们在技术层面上的行为方式?

基于https://firebase.google.com/docs/database/ios/offline-capabilities,我很清楚它应该如何在高级别上工作 - Firebase 本质上保留了您可以在离线时访问的数据的缓存副本。

我不明白我的观察者应该开火多少次以及使用什么信息。

firebase 是否总是先触发我的观察者一次,首先是任何缓存数据(如果没有任何数据,则为 null),然后是服务器数据。 还是仅在缓存数据存在时才发送缓存数据,然后再发送服务器数据。 observerSingleValue 和持续观察者在持久模式下的行为有什么区别吗?

在我们启用持久性的应用中,我注意到:

Firebase 只是发送服务器数据 Firebase 发送缓存数据(如果存在)然后发送服务器数据。 Firebase 发送缓存数据,如果不存在则返回 null,然后是服务器数据。

最好把它弄清楚,这样我们就知道哪个应该是正常行为:)

【问题讨论】:

【参考方案1】:

其实很简单。当您附加观察者时(无论是使用observeEventType 还是observeSingleEventOfType),Firebase 将:

    立即使用任何完整缓存数据引发事件。 从服务器请求更新的数据,当数据到达时,如果数据与缓存的数据不同,则引发新事件。

不过,这里有一些微妙之处:

我们只会在缓存数据完整时引发带有缓存数据的事件。这意味着: 如果我们没有缓存数据(您之前没有观察到此位置),我们将不会引发 null 或类似事件。在我们从服务器获取数据之前,您不会收到任何事件。 如果您有此位置的部分数据(例如,您之前观察过 /foo/bar,但现在您正在观察 /foo),您将收到完整子级的 ChildAdded 事件(例如 / foo/bar),但在我们从服务器获取您正在观察的位置的完整数据之前,您不会收到 Value 事件(例如 /foo)。 如果您使用observeSingleEventOfType,则您明确要求只请求一个事件,因此如果您有缓存数据,#1 会发生但#2 不会发生,这可能不是您想要的(您永远不会看到最新的服务器数据)。

希望这会有所帮助!

【讨论】:

谢谢 Micheal,我注意到我们得到 null 作为缓存数据的情况,即使它以前没有被观察到。所以我会将此报告为错误谢谢:)。 是的,这听起来确实可能是一个错误。如果您可以为我们提供一种重现该行为的方法,那就太好了。我确实忘记提及的一件事是,缓存的数据可以来自我们之前从服务器接收的数据,也可以来自您在本地写入的数据。因此,如果您在代码中设置(null),我们现在将为该位置缓存 null,即使我们从未从服务器获取数据。 如何使用observeSingleEventOfType 从服务器获取最新数据?我有persistenceEnabled,并且只想获取一次最新数据,但如果我在线则不要使用缓存的数据 @swalkner 那是不可能的,我只能使用最新的更新。

以上是关于在 Firebase 中启用持久性后实际会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

启用复杂脚本支持后究竟会发生啥?

注销后清除 Firebase 持久性

1 小时后身份验证令牌无效 - Firebase 中的磁盘持久性

如果我不在 firebase 回收器选项中调用 adapter.stopListening 会发生啥

如何启用 Firebase 实时数据库离线持久性?

在 Google Play 控制台中启用外部营销会发生啥?