如何使用 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)
}
我正在使用 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)
}