如何使用 Swift 从 Firebase DB 参考路径中删除观察者?

How to removeObserver from Firebase DB reference path using Swift?

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

Firebase 参考资料:

REF_USERS = DB_BASE.child("users")

函数attaching/listening到路径和转义:

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#>)
    }

根据Firebase documentation on detaching listeners

When you add a callback block to a reference, a FIRDatabaseHandle is returned. These handles can be used to remove the callback block.

所以在你的情况下:

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

然后在你的 viewWillDisappear:

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