参考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()
侦听器会怎么做?
答案 0 :(得分:3)
您可以在节点的父节目上收听child_changed。
ref.on('child_changed', callback)
每次编辑一个孩子时,这将为您提供该孩子的更新价值。
修改强>
value
为您提供附加到child_added
和child_changed
为您提供附加到的节点的子项值例如,如果将这些事件的侦听器附加到包含用户列表的节点:
value
都会向您提供所有用户child_added
和child_changed
只会为您提供已编辑/添加的用户如果您只想让数据在客户端中保持同步,则可以使用child_added
和child_changed
使用相同的回调来创建/更新本地数据库副本中的值。