在Firebase中启用持久性时实际发生了什么?

时间:2016-05-17 12:40:20

标签: android ios firebase firebase-realtime-database

在iOS中打开Firebase的持久性时,我的观察者会发生什么事实以及他们在技术层面上的表现如何?

我很清楚它应该如何在基于此https://www.firebase.com/docs/ios/guide/offline-capabilities.html的高级别上运行 - Firebase基本上保留了您可以在离线时访问的数据的缓存副本。

我不明白的是我的观察者应该开枪多少次以及有什么信息。

  • firebase是否总是首先使用任何缓存数据触发我的观察者(如果没有任何数据,则为null),然后是服务器数据。
  • 或者只发送缓存的数据(如果存在,后跟服务器数据)。
  • 在持久模式下,observerSingleValue与持续观察者行为之间是否有任何区别?

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

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

最好清除这一点,以便我们知道哪些应该是正常行为:)

1 个答案:

答案 0 :(得分:15)

实际上非常简单。当您附加观察者(无论是使用,还是db.collection.find({ "fieldToCheck" : { $exists : true, $ne : null } }) )时,Firebase会:

  1. 使用任何完整的缓存数据立即引发事件。
  2. 从服务器请求更新的数据,当它到达时,如果数据与缓存的数据不同,则引发新事件。
  3. 虽然有一些细微之处:

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

    希望这有帮助!