如何让听众在离线时在 Firebase 中工作以进行多位置更新

How to make listeners work in Firebase for multi-location updates while offline

这可能是 Firebase 中的错误。 childAdded 如果我 post 到 2 级节点和更高级别的节点,则不会触发侦听器 ?

这是我的架构:

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" }
              }
         }
    }
}

  1. iOS设备离线。

  2. 我正在使用`

    收听以下节点
    .observe(.childAdded..
    

    root / company1 / 05062017 / user1
    
  3. 现在,假设我想在 employee1 下添加一个新对象:

    5: { "a": "aa", "b": "bb", "c": "cc" }
    
  4. 如果我像这样添加对象,则会触发侦听器:

    updateChildValues(["root/company1/05062017/user1/5": ["a": "aa", ...]])
    
  5. 问题是如果我想像这样添加一个对象

    updateChildValues([
        "root/company1/05062017/user1/5/a": "aa",
        "root/company1/05062017/user1/5/b": "bb",
        "root/company1/05062017/user1/5/c": "cc", 
    ])
    

    在那种情况下,在我连接到 Internet 之前不会触发侦听器。

  6. 如果我连接到 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 中的所有数据(因为您没有专门编写该节点),因此在与服务器协调之前不会触发事件.