没有Firebase DatabaseReference没有停止观察,这是绝对正确的吗?

时间:2017-11-16 01:29:32

标签: ios firebase firebase-realtime-database swift4

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(有趣的是,我无法在任何地方谷歌上明确的边缘性)。

我意识到你可以将它们放在一个笨拙的阵列中,但似乎不可思议的是,会阻止观察?!

脚注

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

1 个答案:

答案 0 :(得分:1)

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

我想从docs我发现了这件事

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

  

使用removeObserverWithHandle:停止接收更新。

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