Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.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
Firebase数据库-避免在iOS上重复下载JSON_Ios_Firebase_Firebase Realtime Database - Fatal编程技术网

Firebase数据库-避免在iOS上重复下载JSON

Firebase数据库-避免在iOS上重复下载JSON,ios,firebase,firebase-realtime-database,Ios,Firebase,Firebase Realtime Database,我的Firebase用例与大多数用例略有不同。我们的后端不专门使用FB。我们有一个处理关系和所有数据的大型MariaDB服务器 我们与FB合作的目标是让iOS设备上的客户端可以使用其特定数据。我们需要加载数据一次,然后监听对该特定数据的更改。以下是其工作原理的大致概述: 主视图控制器已加载 Firebase已初始化,我们将侦听FIRDataEventTypeChildAdded。(已启用持久性) Firebase加载所有匹配的记录。然后,我们循环并将它们本地存储在内部SQLite数据库中 在正常

我的Firebase用例与大多数用例略有不同。我们的后端不专门使用FB。我们有一个处理关系和所有数据的大型MariaDB服务器

我们与FB合作的目标是让iOS设备上的客户端可以使用其特定数据。我们需要加载数据一次,然后监听对该特定数据的更改。以下是其工作原理的大致概述:

  • 主视图控制器已加载
  • Firebase已初始化,我们将侦听FIRDataEventTypeChildAdded。(已启用持久性)
  • Firebase加载所有匹配的记录。然后,我们循环并将它们本地存储在内部SQLite数据库中 在正常的用户流中,我们在屏幕上推送其他ViewController。问题是,一旦加载了主ViewController,FIRDataEventTypeChildAdded会为每个记录再次激发

    问题:

  • 当FIRDataEventTypeChildAdded再次触发时,它是从内部缓存加载数据(持久化?),还是从Firebase服务器重新下载所有内容?我已经使用网络链接调节器完全切断了互联网连接,当我这样做时,它根本不会触发FIRDataEventTypeChildAdded,但一旦网络恢复,它就会为每个记录触发FIRDataEventTypeChildAdded
  • 在登录时加载所有记录,然后只侦听对这些记录的更改的情况下,如何实现上述目标?我已经在使用orderBy和startingAt,因此如果答案涉及上述任何一项,我无法添加另一个“hasDownloaded=yes”筛选器

  • 提前感谢。

    Firebase引用侦听器连接到服务器一次,并保持连接,直到该查询关闭。只要所侦听的引用在内存中,就只有一个到数据库的连接。一旦发生此连接,所有数据将作为子添加数据再次通过

    这里的问题不是Firebase的问题,而是你的应用程序不断地将侦听器读取到引用,使得每次都从网络上重新下载数据


    所以对于你的第一个问题,是的,它是从网络上重新下载的。其次,您只需要确保Firebase查询永远不会离开内存。这可以通过使您的查询在全局范围内完成,或者只需在视图控制器退出范围时不关闭查询即可(然后您需要确保在后续加载时不读取多个查询)。

    Firebase引用侦听器连接到服务器一次,并保持连接,直到该查询关闭为止。只要所侦听的引用在内存中,就只有一个到数据库的连接。一旦发生此连接,所有数据将作为子添加数据再次通过

    这里的问题不是Firebase的问题,而是你的应用程序不断地将侦听器读取到引用,使得每次都从网络上重新下载数据


    所以对于你的第一个问题,是的,它是从网络上重新下载的。其次,您只需要确保Firebase查询永远不会离开内存。这可以通过将查询设置为全局作用域来实现,也可以通过在视图控制器退出作用域时不关闭查询来实现(然后您需要确保在后续加载时不读取多个查询)。

    请共享您正在测试的代码。没有这些,就很难说什么具体的话。请参见上的。在这种情况下,代码并不重要。问题是Firebase在幕后的工作方式没有明确的定义。为了简单起见,我的主ViewController中有一个ChildAdded和ChildChanged监听器:请重新阅读我上面的问题,因为这涉及到理解每次加载VC时是否从服务器下载JSON,或者,如果它从本地缓存中获取它,但仍然启动ChildAdded侦听器。如果不了解viewController和Firebase是如何在代码中实现的,则不清楚这里的用例是什么。i、 e.每次加载VC都高度依赖于VC中的代码。.childAdded事件是特意为每个子级触发一个事件,然后为添加的任何其他子级触发一个事件。它将为重新连接后添加的任何新子级触发,不过,这取决于您的实现。请共享您正在测试的代码。没有这些,就很难说什么具体的话。请参见上的。在这种情况下,代码并不重要。问题是Firebase在幕后的工作方式没有明确的定义。为了简单起见,我的主ViewController中有一个ChildAdded和ChildChanged监听器:请重新阅读我上面的问题,因为这涉及到理解每次加载VC时是否从服务器下载JSON,或者,如果它从本地缓存中获取它,但仍然启动ChildAdded侦听器。如果不了解viewController和Firebase是如何在代码中实现的,则不清楚这里的用例是什么。i、 e.每次加载VC都高度依赖于VC中的代码。.childAdded事件是特意为每个子级触发一个事件,然后为添加的任何其他子级触发一个事件。它将为重新连接后添加的任何新子级触发,不过,这取决于您的实现。