在 Swift 3 中使用 removeObserver(withHandle,不会在 viewDidDisappear 上删除观察者
var query = FIRDatabaseQuery()
var postRef: FIRDatabaseReference!
var postRefHandle: FIRDatabaseHandle?
override func viewDidLoad() {
super.viewDidLoad()
postRef = baseRef.child("Posts")
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
if postRefHandle != nil {
//try 1:
//postRef.removeObserver(withHandle: postRefHandle!)
//try 2:
//postRef.queryOrdered(byChild: "sortTimestamp").removeObserver(withHandle: postRefHandle!)
//try 3:
//query.removeObserver(withHandle: postRefHandle!)
}
//try 4:
//postRef.removeAllObservers() //works
}
func getPosts()
{
var count = 20
query = postRef.queryOrdered(byChild: "sortTimestamp")
postRefHandle = query.queryLimited(toFirst: UInt(count)).observe(.childAdded //etc.
}
于是我尝试了viewDidDisappear中的三个方法,但是观察者并没有被移除。 尝试 3 query.removeObserver(withHandle: postRefHandle!) 作为来自 Firebase, how do I return a handle so that I can call removeObserver? 的回答作者:弗兰克范普菲伦
唯一可行的是尝试 4 中概述的那个。 我无法使用 removeObserver(withHandle? (try 1 - 3)) 删除 Observer 的任何原因
“query.queryLimited(toFirst: UInt(count)).observe(.childAdded”也没有从 Firebase 获取最新数据。我的印象是 observe 总是获取更新的数据,而不是 observeSingleEvent。为什么它不这样做吗?
非常感谢任何建议。
最佳答案
如果你有如下代码:
var postsRef: FIRDatabaseReference!
var postRefHandle: FIRDatabaseHandle!
var query = FIRDatabaseQuery()
func addHandler() {
self.postsRef = self.ref.child("posts")
var count = 20
self.query = self.postsRef.queryOrdered(byChild: "sortTimestamp")
self.postRefHandle = self.query.queryLimited(toFirst: UInt(count)).observe(.childAdded, with: { snapshot in
print(snapshot)
})
}
稍后你会执行此功能
self.postsRef.removeObserver(withHandle: self.postRefHandle!)
它移除了观察者。这是经过测试的代码。
关于问题的第二部分:querySingleEvent 和 observe 在数据方面做同样的事情,但具有不同的行为。它们都将始终获得当前数据 - 由 startAt、endAt、equalTo 等修改。
observeSingleEvent returns the data, does NOT leave an observer so you will not be notified if that data changes
observe returns the data and leaves an observer attached to the node and will notify you of future changes.
.childAdded:当任何 child 被添加到节点时 .childChanges:当节点中的任何 child 发生变化时 .childRemoved:当一个 child 被移除时。
关于swift - 使用 Firebase,Swift removeObserver(withHandle 不会删除观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43634926/