【问题标题】:Firebase: Listen for changes on child nodes after retrieving them all using .once()?Firebase:在使用 .once() 检索所有子节点后监听它们的变化?
【发布时间】:2016-07-01 07:42:54
【问题描述】:

参考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,是否会使分页变得多余,即如果我已经使用 .once() 浏览了所有数据,添加 .on() 侦听器会做什么?

【问题讨论】:

    标签: cordova memory firebase firebase-realtime-database


    【解决方案1】:

    您可以在您的节点的父节点上监听child_changed

    ref.on('child_changed', callback)

    每次编辑孩子时,都会为您提供该孩子的更新值。

    编辑

    • value 为您提供它所连接的节点的值
    • child_addedchild_changed 为您提供它所附加到的节点的子节点的值

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

    • value 将在每次添加/编辑用户时为您提供所有用户
    • child_addedchild_changed 将只为您提供已编辑/添加的用户

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

    【讨论】:

    • 感谢德维德。我已经知道 child_changed,但我也需要 child_add。所以我考虑使用 .on('value', callback) 因为它涵盖了这两种情况。
    • 另外,据我所知,child_changed 和 child_added 仍然检索父节点下的所有数据,和 .on('value') 一样
    • 是的,我认为您通过解释 value 为每次编辑提供节点下的所有数据间接回答了这个问题。对于子节点经常被编辑的大节点来说,这将是非常糟糕的!所以我宁愿使用child_addedchild_changed。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2017-06-27
    相关资源
    最近更新 更多