为什么removeAllObservers()不能在deinit中工作?
众所周知,在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... }
然而!
经过相当多的testing之后,您不能在deinit
调用clearObservations()
,您必须在viewDidDisappear
(或其他某个逻辑位置)中调用它。
再次 – 它明确地不起作用 。
我的问题,为什么实际上这不起作用呢?
顺便说一下,您启动了一个Firebase观察器,如下所示:
say, viewWillAppear# o = Database.database().reference(withPath: "string") o!.observe(.value, with: { (snapshot) in self.blah(snapshot) })
我相信你的问题可能是deinit
没有被调用,通常这种事情是因为你的观察者closures强烈地保留自我,closures本身被firebase服务保留。 这意味着你的对象永远不会死亡。 你可以用一个unowned
或weak
捕获来打破这种循环。
要检查是否属于这种情况,请在您的退出中打印一张照片。 如果打印没有被调用,当你期望那么对象没有被释放,你应该运行内存debugging器,看看还有谁指着它。
我以前也有同样的问题,忘记把无主观察方法。
- Firebase云消息传递开发和发布configuration文件
- Firebase查询与限制/偏移可能的解决scheme
- 导入Firebase后,Xcode 8.0testing版会发出错误提示
- Swift Admob控制台显示模拟器设备ID,但不在iPhone上运行?
- Firebase-找不到configuration文件:“GoogleService-Info.plist”
- 发布到Clearcut时发生错误:(null),Google Cloud Speech API中的状态码为400
- 立即刷新Firebase iOS SDKcaching
- iOS Firebase推送通知:如何提供Firebase用户的设备令牌并发送通知
- 在Firebase中版本化对象