【问题标题】:How to removeObserver from Firebase DB reference path using Swift?如何使用 Swift 从 Firebase DB 参考路径中删除观察者?
【发布时间】:2018-11-29 15:50:39
【问题描述】:

我正在使用 DataService 单例类按照以下函数成功读取和侦听 Firebase 路径 users 上的数据更改。

Firebase 参考:

REF_USERS = DB_BASE.child("users")

附加/监听路径和转义的函数:

func getUsers(handler: @escaping (_ name: String, _ discoverable: Bool) -> ()){

   REF_USERS.observe(.value) { (snapshot) in
        guard let usersSnapshot = snapshot.children.allObjects as? [DataSnapshot] else { return }
        for user in usersSnapshot{
            let name = user.childSnapshot(forPath: "name").value as! String
            let discoverable = user.childSnapshot(forPath: "discoverable").value as! Bool

            handler (name, discoverable)
        }
    }

}

我在我的DiscoverVC 中使用上述函数:

DataService.run.getUsers { (name, discoverable) in
            print("name: \(name), discoverable: \(discoverable)")
        }

如何在viewWillDisappear 函数中从DiscoverVC 中删除观察者?

我知道我需要在removeObserver 调用中传递一个DatabaseHandle,我该如何构建句柄?

override func viewWillDisappear(_ animated: Bool) {

        DataService.run.REF_USERS.removeObserver(withHandle: <#T##UInt#>)
    }

【问题讨论】:

    标签: swift firebase firebase-realtime-database observers


    【解决方案1】:

    根据Firebase documentation on detaching listeners

    当您向引用添加回调块时,将返回 FIRDatabaseHandle。这些句柄可用于移除回调块。

    所以在你的情况下:

    handle = REF_USERS.observe(.value) { (snapshot) in
      ...
    }
    

    然后在你的viewWillDisappear:

    override func viewWillDisappear(_ animated: Bool) {
        DataService.run.REF_USERS.removeObserver(withHandle: handle)
    }
    

    【讨论】:

    • 这是有道理的,但是我如何在我的viewWillDisappear 中引用handle,它位于不同的Class 中,称为DiscoverVC 到位于Singleton Class 中的回调块中叫DataService?
    • 您必须将句柄从一个类传递给另一个类。快速搜索显示this tutorialthis question。但老实说,这听起来像是一种反模式:我希望附加侦听器的代码和删除它的代码在同一个类中,彼此非常接近。这两者相距越远,解决问题就越困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2018-01-06
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多