ios - 如何让监听器在 Firebase 中工作以在离线时进行多位置更新
问题描述
这可能是 Firebase 中的一个错误。如果我发布到 2 级及更高级别的childAdded
节点,监听器不会被触发?
这是我的架构:
root: {
company1: {
05062017: {
user1: {
"1": { "a": "aa", "b": "bb", "c": "cc" }
"2": { "a": "aa", "b": "bb", "c": "cc" }
"3": { "a": "aa", "b": "bb", "c": "cc" }
"4": { "a": "aa", "b": "bb", "c": "cc" }
}
}
}
}
iOS 设备离线。
我正在使用 ` 收听以下节点
.observe(.childAdded..
上
root / company1 / 05062017 / user1
现在,假设我想在下面添加一个新对象
employee1
:5: { "a": "aa", "b": "bb", "c": "cc" }
如果我像这样添加对象,则会触发侦听器:
updateChildValues(["root/company1/05062017/user1/5": ["a": "aa", ...]])
问题是如果我想添加这样的对象
updateChildValues([ "root/company1/05062017/user1/5/a": "aa", "root/company1/05062017/user1/5/b": "bb", "root/company1/05062017/user1/5/c": "cc", ])
在这种情况下,直到我连接到 Internet 才会触发侦听器。
如果我连接到 Internet,然后再次断开连接,一切都会恢复正常。问题是有时在一天开始时,互联网不可用,所以我必须在没有连接的情况下开始工作。
我现在正在解决它,我只想知道这种行为背后的原因是什么?
解决方案
这不是错误,而是 Firebase 保证的一部分。这绝对是没有多少开发人员遇到的行为,所以我将尝试解释......
Firebase 客户端仅在确定它具有该位置的完整数据时才会触发该位置的事件。
这段代码:
updateChildValues(["root/company1/05062017/user1/5": ["a": "aa", ...]])
是相同的:
.child("root/company1/05062017/user1/5").setValue(["a": "aa", ...])
这将替换 处的所有数据root/company1/05062017/user1/5
,因此客户端可以确定该["a": "aa", ...]
位置是完整的新数据。
但是当你运行这段代码时:
updateChildValues([
"root/company1/05062017/user1/5/a": "aa",
"root/company1/05062017/user1/5/b": "bb",
"root/company1/05062017/user1/5/c": "cc",
])
客户端在任何时候都不能保证它知道所有数据root/company1/05062017/user1/5
(因为您没有专门编写该节点),因此在与服务器协调之前它不会触发事件。
推荐阅读
- java - Android:如何在通话记录中搜索特定号码
- node.js - MongoDB:$lookup 数组后的 $sum
- python - 在线程中运行机器人文件(对话框)
- c# - 如何在从 Form 派生的类中公开控件的所有属性?
- python - 如果我得到一条随机线,是否有可能得到它下面的第 2 行?
- python - f 字符串仅在 ubuntu 服务器上提供无效的语法错误
- r - 如何拟合加性线性模型数据集厌食症包 MASS R
- python - Numpy,乘法运算?(M[i, j] = a[i] * b[j])
- javascript - 自定义 Chart.js
- android - Android 应用程序是否应该在发送数据之前检查 Wear 是否已连接?