为什么removeAllObservers()在deinit中不起作用?

2024-05-08

众所周知,在 iOS 中使用 Firebase 的强大功能时,

每当您在视图控制器中进行观察时,

var o: DatabaseReference?
var o2: DatabaseReference?
var o3: DatabaseReference?

重要的是,当该屏幕消失时,您必须终止所有观察......

private func clearObservations() {

    print("\n\n clearing observations! \n\n")

    if o != nil {

        o?.removeAllObservers()
        o = nil
    }

    if o2 != nil {
    etc...
}

However!

经过大量测试后,您无法调用clearObservations() in deinit- 你必须调用它viewDidDisappear(或其他一些合乎逻辑的地方)。

再次 - 它明确不起作用 in deinit.

我的问题是,为什么这实际上不起作用deinit?


顺便说一句,您可以像这样启动 Firebase 观察器:

say, viewWillAppear#

    o = Database.database().reference(withPath: "string")
    o!.observe(.value, with: { (snapshot) in

        self.blah(snapshot)
    })

我相信你的问题很可能是deinit根本没有被调用,通常这种情况是因为您的观察者闭包强烈保留 self 并且闭包本身由 firebase 服务保留。这意味着你的对象永远不会消亡。你可以用以下方法打破这种循环unowned or weak捕获。

要检查是否是这种情况,请在您的 deinit.txt 文件中输入打印内容。如果 print 没有在您期望的时候被调用,那么该对象就没有被释放,您应该运行内存调试器来查看还有谁在指向它。

当我忘记将 unowned 放在领域观察方法上时,我以前也遇到过同样的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么removeAllObservers()在deinit中不起作用? 的相关文章

随机推荐