2017-06-17 44 views
1

我的Firebase用例与大多数用户略有不同。我们不使用FB专门用于我们的后端。我们有一个处理关系和所有数据的大型MariaDB服务器。Firebase数据库 - 避免在iOS上反复下载JSON

我们使用FB的目标是允许iOS设备上的客户端提供其特定的数据。我们需要加载数据一次,然后监听对这些特定数据的更改。这里是它如何工作的一个粗略地:

  1. 主视图控制器被加载
  2. 火力地堡已经初始化,我们听FIRDataEventTypeChildAdded。 (持续性已启用)
  3. Firebase加载所有匹配的记录。然后我们遍历并将它们本地存储在内部SQLite数据库中。

在正常的用户流中,我们在屏幕上推送其他ViewControllers。问题是,一旦加载了主ViewController,FIRDataEventTypeChildAdded会为每条记录再次触发。

问题:

  1. 当FIRDataEventTypeChildAdded再次开火,它是由加载其内部缓存(持久性?)的数据,或者它重新下载从服务器火力地堡的一切?我使用Network Link Conditioner完全切断了互联网连接,当我这样做时,它根本不触发FIRDataEventTypeChildAdded,但一旦网络返回,它就会为每条记录触发FIRDataEventTypeChildAdded。
  2. 我怎样才能实现上述加载登录的所有记录,然后只听取这些记录的变化?我已经使用orderBy和startingAt所以如果答案涉及上述之一,我不能添加另一个“hasDownloaded = yes”过滤器。

在此先感谢。

+0

请分享您正在测试的代码。没有这个,很难说具体的东西。另请参阅[创建MCVE](http://stackoverflow.com/help/mcve)。 –

+0

在这种情况下,代码无关紧要。问题在于Firebase在幕后工作的方式没有明确的定义。 为了简单起见,我在我的主ViewController中有一个ChildAdded和ChildChanged侦听器: 请重新阅读我上面的问题,因为它涉及了解每次装入VC时是否从服务器下载JSON,或者如果它从本地缓存中获取它,但仍然触发ChildAdded侦听器。 – Adam

+0

目前还不清楚在这里没有看到你的viewController和Firebase是如何在代码中实现的。即每次VC被加载*都高度依赖于VC内的代码。 .childAdded事件有意设计为每个孩子启动一个,然后添加任何其他孩子。它会触发重新连接后添加的任何新的子项,但是,它依赖于您的实施。 – Jay

回答

0

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

这里的问题与Firebase没什么关系,但是您的应用不断地将侦听器读取到引用中,使得数据每次都从网络中重新下载。

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