在我的应用中,我获取了这样的实时数据:
//Firebase
var ref: FIRDatabaseReference?
var handle: FIRDatabaseHandle?
override func viewDidLoad() {
ref = FIRDatabase.database().reference()
handle = ref?.child("posts").child(String(itemId)).observe(.childChanged, with: { (snapShot) in
if let item = snapShot.value as? String {
print(item)
}
})
.....
现在阅读firebase文档我看到了:
当您离开ViewController时,观察者不会自动停止同步数据。如果没有正确删除观察者,它会继续将数据同步到本地内存。
所以我添加了这个在退出VC时被触发的函数:
@IBAction func backButtonDidTouch(_ sender: AnyObject) {
if let handle = handle {
ref?.removeObserver(withHandle: handle)
}
showNavBar = true
_ = navigationController?.popViewController(animated: true)
}
但是,我也可以致电removeAllObservers()
removeObserver()
,并且文档也说:
在侦听器上调用removeObserverWithHandle
或removeAllObservers
不会自动删除在其子节点上注册的侦听器;您还必须跟踪这些引用或句柄以将其删除。
所以看着我的代码我做得对吗?当我退出VC时,我不想在我的应用程序和firebase之间保持数据同步
答案 0 :(得分:2)
您似乎在特定帖子上调用观察者,但是您要从父引用中删除观察者。正如文档所述,从引用中删除侦听器并不会清除子节点中的观察者,因此我相信您没有按照预期删除观察者。
答案 1 :(得分:0)
我自己遇到过这个问题。特别是当我将用户注销一小段时间时,呈现视图控制器正在尝试从firebase和崩溃中读取。我所做的是在我使用的单例中定义一组类型DatabaseReference
。我打电话的地方
ref.observe(.value) {(snapshot) in
singleton.refsUsed.insert(snapshot.ref)
...
}
然后在注销时,在我关闭当前视图控制器之前,我正在迭代引用集中的所有项并删除所有观察者。