首页 > 解决方案 > Firebase 使用 Swift 添加/删除/更改子侦听器

问题描述

Firebase官方文档指出:

已添加子项

EventHandler< ChildChangedEventArgs > ChildAdded

相对于该位置添加子节点时引发的事件。

注册一个处理程序以观察何时相对于此 Query 对象添加子项。每次添加子节点时,都会使用数据的不可变快照调用您的处理程序。

已移除子项

EventHandler< ChildChangedEventArgs > ChildRemoved

相对于该位置删除子节点时引发的事件。

注册一个处理程序以观察何时相对于此 Query 对象删除子项。每次删除子节点时,都会使用数据的不可变快照调用您的处理程序。

ChildChanged

EventHandler< ChildChangedEventArgs > ChildChanged

当子节点相对于该位置发生更改时引发的事件。

注册一个处理程序以观察与此 Query 对象相关的子项的更改。每次更改子节点时,将使用数据的不可变快照调用您的处理程序。

到目前为止,我正在成功使用 ChildRemoved 和 ChildAdded,它们工作稳定,对我正在做的事情没有任何麻烦。特别是,这两个监听器是独立的,也就是说:保证其中一个触发的动作不会触发另一个触发。因此,我不必进行任何同步或调度来解决冲突。

我的问题是:这三种听众类型是否相互独立?

也就是说:

  1. 对于任何给定的动作,我保证三个听众中的一个,最多一个会触发。
  2. 只有 ChildAdded 在第一次建立侦听器时触发。其他两种侦听器类型则没有。

关于文档的注释,如果 ChildChanged 的​​文档将指定“childChanged”的含义,它将解决歧义:它是否包括添加/删除/移动/编辑子项,还是仅专注于编辑现有孩子?

标签: iosswiftfirebasefirebase-realtime-database

解决方案


这些事件中的每一个都是处理跨客户端数据同步的特定方式。

  • .childChanged

    每当有变化时都会被调用

所以如果你有一个像下面这样的实时数据库:

/store/<random-number-inserted-by-firebase-1>/name/store-1
/store/<random-number-inserted-by-firebase-1>/location/street-1
/store/<random-number-inserted-by-firebase-1>/items/0/name/name-1
/store/<random-number-inserted-by-firebase-1>/items/0/type/type-1
/store/<random-number-inserted-by-firebase-1>/items/1/name/name-2
/store/<random-number-inserted-by-firebase-1>/items/1/type/type-2
/store/<random-number-inserted-by-firebase-2>/name/store-2
/store/<random-number-inserted-by-firebase-2>/location/street-2

您一起在“/store”上启动 childAdded、childChanged 和 childRemoved 观察者。

如果您更改/store/<random-number-inserted-by-firebase-1>/items/0/type/type-1/store/<random-number-inserted-by-firebase-1>/items/0/type/new-type-1您的 childChanged 回调函数将收到一个字典["random-number-inserted-by-firebase-1": ["name": "store-1", "location": "street-1", "items": [["name": "name-1", "type": "new-type-1"], ["name": "name-2", "type": "type-2"]] .childAdded侦听节点中的任何更改。


推荐阅读