Firebase数据库分离侦听器

时间:2017-04-17 23:26:46

标签: ios swift firebase firebase-realtime-database

在我的应用中,我获取了这样的实时数据:

//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(),并且文档也说:

在侦听器上调用removeObserverWithHandleremoveAllObservers不会自动删除在其子节点上注册的侦听器;您还必须跟踪这些引用或句柄以将其删除。

所以看着我的代码我做得对吗?当我退出VC时,我不想在我的应用程序和firebase之间保持数据同步

2 个答案:

答案 0 :(得分:2)

您似乎在特定帖子上调用观察者,但是您要从父引用中删除观察者。正如文档所述,从引用中删除侦听器并不会清除子节点中的观察者,因此我相信您没有按照预期删除观察者。

答案 1 :(得分:0)

我自己遇到过这个问题。特别是当我将用户注销一小段时间时,呈现视图控制器正在尝试从firebase和崩溃中读取。我所做的是在我使用的单例中定义一组类型DatabaseReference。我打电话的地方

ref.observe(.value) {(snapshot) in 
 singleton.refsUsed.insert(snapshot.ref)
 ...
}

然后在注销时,在我关闭当前视图控制器之前,我正在迭代引用集中的所有项并删除所有观察者。