【问题标题】:Firebase added/removed/changed children listener using SwiftFirebase 使用 Swift 添加/删除/更改子侦听器
【发布时间】:2019-09-23 01:36:57
【问题描述】:
官方Firebase Documentation表示:
已添加子项
EventHandler ChildAdded
相对于该位置添加子节点时引发的事件。
注册一个处理程序以观察何时添加相对于此的子级
查询对象。每次添加子节点时,您的处理程序
将使用数据的不可变快照调用。
ChildRemoved
EventHandler ChildRemoved
当子节点被移除时引发的事件
位置。
注册一个处理程序以观察子项何时被删除
这个查询对象。每次删除子节点时,您的
将使用数据的不可变快照调用处理程序。
ChildChanged
EventHandler ChildChanged
当子节点相对于此发生更改时引发的事件
位置。
注册一个处理程序以观察与此相关的孩子的变化
查询对象。每次更改子节点时,您的处理程序
将使用数据的不可变快照调用。
到目前为止,我成功地使用了 ChildRemoved 和 ChildAdded,它们工作稳定,对我正在做的事情没有任何麻烦。特别是,这两个监听器是独立的,也就是说:保证其中一个触发的动作不会触发另一个触发。因此,我不必进行任何同步或调度来解决冲突。
我的问题是:这三种侦听器类型是否相互独立?
也就是说:
- 对于任何给定的操作,我保证三个侦听器中的一个,最多一个会触发。
- 只有 ChildAdded 在首次建立侦听器时触发。其他两种侦听器类型则没有。
关于文档的注释,如果 ChildChanged 的文档将指定“childChanged”的含义,它将解决歧义:它是否包括添加/删除/移动/编辑孩子,还是只专注于编辑给现有的孩子?
【问题讨论】:
标签:
ios
swift
firebase
firebase-realtime-database
【解决方案1】:
这些事件中的每一个都是处理跨客户端数据同步的特定方式。
-
.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 侦听节点中的任何更改。