在 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的内涵,实际上是回家并停止观察。我花了很多时间担心这个细节。
答案 0 :(得分:1)
正如我在评论中所解释的那样,您必须手动删除观察者,因为Firebase会保留对您的DatabaseReference和闭包的引用。如果你没有使用DatabaseReference它没有取消分配它,它还有另一个引用它。
我想从docs我发现了这件事
很多时候,您会在文档中看到:
使用removeObserverWithHandle:停止接收更新。
所以这就是方式,也是唯一的方法。