Nil’ing Firebase DatabaseReference不会停止观察是否绝对正确?

Awesome即Firebase中 ,您可以执行此操作

var r1: DatabaseReference? = nil 

然后这个

  r1 = Database.database().reference(withPath: "score/bucks") r1!.observe(.childAdded) { snapshot in ... } 

然后玩得开心

但最终你必须做这样的事情

 private func clearObservations() { // call from viewDidDisappear if r1 != nil { r1?.removeAllObservers() r1 = nil } if r2 != nil { r2?.removeAllObservers() r2 = nil } .. etc etc etc etc etc etc :/ :/ } 

{关键一点:值得注意的是你不能在deinit中做到这一点,你必须在viewDidDisappear中做到这一点}

一个人不能只是看起来非常不可思议

  r1 = nil // and this will remove the observor 

以下情况是否诚实

  • 如果你只是一个DatabaseReference
  • 即你不打算removeAllObservors
  • 事实上观察继续下去吗?

是对的吗?

我只是想彻底澄清这一点并将其记录在案 – 它可能会帮助未来的googlers(有趣的是,我无法在任何地方谷歌上明确的边缘)。

我意识到你可以把它们放在一个hokey数组等等,但似乎不可思议的是没有人停止观察?!


脚注

有一件事总是让我感到不安。 如果你仔细阅读doco for removeAllObservors ,它真正断言它会丢弃或终止你添加的闭包。 事实上,它并不是说removeAllObservors实际上在iPhone中有Firebase的内涵,实际上是回家并停止观察。 我花了很多时间担心这个细节。

正如我在评论中所解释的那样,您必须手动删除观察者,因为Firebase会保留对DatabaseReference和闭包的引用。 如果你没有使用DatabaseReference它没有释放它,它有另一个引用它。

我想从文档中可以看出这是怎么回事

很多时候你会在文档中看到:

使用removeObserverWithHandle:停止接收更新。

所以这是方式,也是唯一的方法。