众所周知,在 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(使用前将#替换为@)