ios - Firebase 使用 Swift 添加/删除/更改子侦听器
问题描述
Firebase官方文档指出:
已添加子项
EventHandler< ChildChangedEventArgs > ChildAdded
相对于该位置添加子节点时引发的事件。
注册一个处理程序以观察何时相对于此 Query 对象添加子项。每次添加子节点时,都会使用数据的不可变快照调用您的处理程序。
已移除子项
EventHandler< ChildChangedEventArgs > ChildRemoved
相对于该位置删除子节点时引发的事件。
注册一个处理程序以观察何时相对于此 Query 对象删除子项。每次删除子节点时,都会使用数据的不可变快照调用您的处理程序。
ChildChanged
EventHandler< ChildChangedEventArgs > ChildChanged
当子节点相对于该位置发生更改时引发的事件。
注册一个处理程序以观察与此 Query 对象相关的子项的更改。每次更改子节点时,将使用数据的不可变快照调用您的处理程序。
到目前为止,我正在成功使用 ChildRemoved 和 ChildAdded,它们工作稳定,对我正在做的事情没有任何麻烦。特别是,这两个监听器是独立的,也就是说:保证其中一个触发的动作不会触发另一个触发。因此,我不必进行任何同步或调度来解决冲突。
我的问题是:这三种听众类型是否相互独立?
也就是说:
- 对于任何给定的动作,我保证三个听众中的一个,最多一个会触发。
- 只有 ChildAdded 在第一次建立侦听器时触发。其他两种侦听器类型则没有。
关于文档的注释,如果 ChildChanged 的文档将指定“childChanged”的含义,它将解决歧义:它是否包括添加/删除/移动/编辑子项,还是仅专注于编辑现有孩子?
解决方案
这些事件中的每一个都是处理跨客户端数据同步的特定方式。
.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侦听节点中的任何更改。
推荐阅读
- wso2esb - 如何在 WSO2IS 中设置访问令牌而不过期
- python - cs50ai tic tac toe minimax TypeError: '>' 在 'NoneType' 和 'float' 的实例之间不支持
- excel - Excel 中的缺勤报告
- r - 使用 ggplot2 打印带有 '\n' 的文本
- android - 如何正确理解 RecyclerView
- assembly - 汉明距离函数
- android - 如何在android中保存相机点击的图片?
- javascript - 无法在flutter webview中使用带有脚本的html
- html - 使父高度适合内容高度(CSS)
- firebase - 谷歌登录后如何在另一个页面上导航