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

时间:2017-06-17 02:23:25

标签: ios firebase firebase-realtime-database

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

我们使用FB的目标是允许iOS设备上的客户端提供其特定数据。我们需要加载一次数据,然后监听对这些特定数据的更改。以下是对其工作原理的概述:

  1. 主ViewController已加载
  2. Firebase已初始化,我们会侦听FIRDataEventTypeChildAdded。 (启用持久性)
  3. Firebase会加载所有匹配的记录。然后我们遍历并将它们本地存储在内部SQLite DB中。
  4. 在普通用户流中,我们在屏幕上推送其他ViewControllers。问题是,一旦加载了主ViewController,FIRDataEventTypeChildAdded将再次为每条记录触发。

    问题:

    1. 当FIRDataEventTypeChildAdded再次触发时,它是从内部缓存(Persistence?)加载数据还是从Firebase服务器重新下载所有内容?我已经使用网络链路调节器来完全切断互联网连接,当我这样做时,它根本不会触发FIRDataEventTypeChildAdded,但是一旦网络返回,它就会为每一条记录触发FIRDataEventTypeChildAdded。
    2. 如何在登录时加载所有记录,然后只监听这些记录的更改?我已经在使用orderBy和startingAt所以如果答案涉及上述之一,我就无法添加另一个" hasDownloaded = yes"过滤器。
    3. 提前致谢。

1 个答案:

答案 0 :(得分:0)

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

这里的问题不在于Firebase,而在于您的应用程序不断地将侦听器读取到引用,每次都会从网络中重新下载数据。

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