【问题标题】:What actually happens when persistence is enabled in Firebase?在 Firebase 中启用持久性时实际会发生什么?
【发布时间】:2019-12-03 09:40:07
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: android ios firebase firebase-realtime-database


    【解决方案1】:

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

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

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

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

    希望这会有所帮助!

    【讨论】:

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