我正在使用 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#>)
}
最佳答案
根据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)
}
关于swift - 如何使用 Swift 从 Firebase DB 引用路径中删除观察者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50949457/