Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在Firebase中启用持久性时实际会发生什么?_Android_Ios_Firebase_Firebase Realtime Database - Fatal编程技术网

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

Android 在Firebase中启用持久性时实际会发生什么?,android,ios,firebase,firebase-realtime-database,Android,Ios,Firebase,Firebase Realtime Database,当在iOS中为Firebase启用持久性时,我的观察者会发生什么情况,以及他们在技术层面上的表现如何 基于此,我有一个好主意,它应该如何在高级别上工作-Firebase本质上保留了一个缓存的数据副本,您可以在脱机时访问该副本 我不明白的是,我的观察者应该发射多少次,使用什么信息 firebase是否总是先触发任何缓存数据(如果没有任何数据,则为null),然后触发服务器数据,从而触发我的观察者一次 或者,它是否只发送缓存数据(如果存在),然后发送服务器数据 在持久化模式下,observerSi

当在iOS中为Firebase启用持久性时,我的观察者会发生什么情况,以及他们在技术层面上的表现如何

基于此,我有一个好主意,它应该如何在高级别上工作-Firebase本质上保留了一个缓存的数据副本,您可以在脱机时访问该副本

我不明白的是,我的观察者应该发射多少次,使用什么信息

  • firebase是否总是先触发任何缓存数据(如果没有任何数据,则为null),然后触发服务器数据,从而触发我的观察者一次
  • 或者,它是否只发送缓存数据(如果存在),然后发送服务器数据
  • 在持久化模式下,observerSingleValue和连续观察者的行为有什么区别吗
在我们启用持久性的应用程序中,我注意到:

  • Firebase正在发送服务器数据
  • Firebase发送缓存数据(如果存在),然后发送服务器数据
  • Firebase发送缓存数据,如果缓存数据不存在,则为null,后跟服务器数据

把这件事弄清楚会很好,这样我们就知道哪些应该是正常的行为:)

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

  • 立即使用任何完整的缓存数据引发事件
  • 从服务器请求更新的数据,如果数据与缓存的数据不同,则在数据到达时引发新事件
  • 不过,这其中有几个微妙之处:

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

    希望这有帮助

    感谢Micheal,我注意到了一种情况,即缓存数据为null,尽管以前没有观察到过。所以我将把它报告为一个bug谢谢:)。是的,听起来确实可能是一个bug。如果你能为我们提供一种复制这种行为的方法,那就太好了。我确实忘记提到的一件事是,缓存数据可以来自我们以前从服务器收到的数据,也可以来自您在本地编写的数据。因此,如果您在代码中设置了(null),我们现在将为该位置缓存null,即使我们从未从服务器获取数据。如何使用
    observeSingleEventOfType
    从服务器获取最新数据?我已启用persistenceEnabled,只想获取一次最新数据,但如果需要,则不使用缓存的数据online@swalkner这是不可能的,我只能使用最新的更新。