为什么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器,看看还有谁指着它。
我以前也有同样的问题,忘记把无主观察方法。
- iOS Swift:无法将值types“__NSCFNumber”转换为“NSString”
- Firebase云消息传递开发和发布configuration文件
- 如何从数据库中提取用户并使用Firebase将其列在表格视图中?
- 与iOS上的FlutterFire和原生GeoFire插件冲突
- Firebase无法在真实设备上使用(iOS)
- Swift Admob控制台显示模拟器设备ID,但不在iPhone上运行?
- 在同一个uitableview中显示两个不同的自定义单元格 – swift firebase
- 在Firebase中,如何查询最近的10个子节点?
- 无法将types''的值转换为期望的参数types'String':在表视图单元格中添加数组以从Fireabse获取数据时