Firebase:使用.once()检索子节点上的更改?

时间:2016-07-01 07:42:54

标签: cordova memory firebase firebase-realtime-database

参考Is it possible to avoid OOM when loading a large data set using Cordova?https://stackoverflow.com/a/28589093/3005222给出的答案,我调整了Kato提供的JSFiddle http://jsfiddle.net/firebase/AgBN7/,以递归方式翻阅大型Firebase数据集(而不是依赖于用户)单击下一页按钮)。

使用ref.startAt(pri, lastKey).limitToFirst(100).once("value", ...)遍历包含100个节点的页面,并将数据保存到本地变量。然后继续下一页,依此类推。最后,我在我的应用程序中使用了大量的本地数据副本。这很棒,但我现在想听听改变,我有两个选择:

选项1: 更改分页代码以使用.on()代替.once()

选项2: 获取所有数据后,请ref.on("value", ...)

我的问题是,从性能角度来看哪个选项更好?我做了整个分页事情,因为我的Cordova应用程序在使用ref.on("value",...)一次性检索所有数据时崩溃,并将其更改为分页方法已修复。现在我想知道我是否选择了选项1,是否会创建大量活跃的听众?如果我选择选项2,它是否会使分页冗余,即如果我已使用.on()已经浏览了所有数据,那么添加.once()侦听器会怎么做?

1 个答案:

答案 0 :(得分:3)

您可以在节点的父节目上收听child_changed

ref.on('child_changed', callback)

每次编辑一个孩子时,这将为您提供该孩子的更新价值。

修改

  • value为您提供附加到
  • 的节点的值
  • child_addedchild_changed为您提供附加到的节点的子项值

例如,如果将这些事件的侦听器附加到包含用户列表的节点:

    每次添加/编辑用户时,
  • value都会向您提供所有用户
  • child_addedchild_changed只会为您提供已编辑/添加的用户

如果您只想让数据在客户端中保持同步,则可以使用child_addedchild_changed使用相同的回调来创建/更新本地数据库副本中的值。