gpt4 book ai didi

ios - 清空 Firebase DatabaseReference 不会停止观察,这绝对正确吗?

转载 作者:行者123 更新时间:2023-12-02 03:09:20 26 4
gpt4 key购买 nike

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 设为 nil,
  • 即您不必费心removeAllObservors
  • 事实上,观察继续进行吗?

是吗?

我只是想彻底澄清这一点并将其记录下来 - 它可能会对 future 的谷歌用户有所帮助(有趣的是,我无法在任何地方真正通过谷歌搜索到有关此问题的明确旁注)。

我知道你可以将它们放入一个做作的数组中,等等,但令人难以置信的是,将一个置零不会停止观察?!

<小时/>

脚注

有一件事一直困扰着我。如果您仔细阅读了 removeAllObservors 的 doco,实际上它所断言的是它会删除或终止您添加的闭包。实际上,它并不是说 removeAllObservors 实际上在 iPhone 中拥有 Firebase 的功能,实际上会打电话回家并停止观察。我花了很多时间担心这个细节。

最佳答案

正如我在评论中所解释的,您必须手动删除观察者,因为 Firebase 保存对 DatabaseReference 和闭包的引用。如果您将 DatabaseReference 设为 nil,则它不会取消分配它,而是有另一个对它的引用。

我猜是来自docs这就是发生的事情

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

Use removeObserverWithHandle: to stop receiving updates.

所以这是办法,也是唯一的办法。

关于ios - 清空 Firebase DatabaseReference 不会停止观察,这绝对正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47320099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com