老实说,我试图找出何时调用ref.removeAllObservers或ref.removeObservers,但我感到很困惑。我喂我做错了。
var noMoreDuplicators = [String]()
func pull () {
if let myIdi = FIRAuth.auth()?.currentUser?.uid {
let ref = FIRDatabase.database().reference()
ref.child("users").queryOrderedByKey().observe(.value, with: { snapshot in
if let userers = snapshot.value as? [String : AnyObject] {
for (_, velt) in userers {
let newUser = usera()
if let thierId = velt["uid"] as? String {
if thierId != myIdi {
if let userName = velt["Username"] as? String, let name = velt["Full Name"] as? String, let userIdent = velt["uid"] as? String {
newUser.name = name
newUser.username = userName
newUser.uid = userIdent
if self.noMoreDuplicators.contains(userIdent) {
print("user already added")
} else {
self.users.append(newUser)
self.noMoreDuplicators.append(userIdent)
}
}
}
}
}
self.tableViewSearchUser.reloadData()
}
})
ref.removeAllObservers()
}
}
在观察单个事件时,我应该只调用removeAllObservers,还是......?我什么时候打电话给它,如果打电话的话呢?
答案 0 :(得分:3)
来自observe(_:with:)
的官方文档:
此方法
用于侦听特定位置的数据更改。这是 从Firebase数据库读取数据的主要方法。你的块 将触发初始数据,并在数据时再次触发 变化。
现在,因为每次数据更改时都会触发此方法,所以它取决于您的用例,如果您想观察数据库中的更改,如果不是,请再次从官方文档中查看:
使用
removeObserver(withHandle:)
停止接收更新。
现在,如果您只想在使用observeSingleEvent(of:with:)
后再观察数据库,请再次使用官方文档:
这相当于观察:with :,除了块 在返回初始数据后立即取消
意味着您不需要为此调用removeObserver(withHandle:)
,因为它会在返回初始数据后立即取消。
最后,如果您要删除所有观察者,可以使用此removeAllObserver
但请注意:
此方法删除当前引用的所有观察者,但确实如此 不要删除子引用的任何观察者。 removeAllObservers必须 为听众所在的每个孩子参考再次调用 成立以移除观察员
答案 1 :(得分:1)
实际上,当您观察单个事件时,您不需要调用removeAllObservers
,因为此观察者只会被调用一次,然后立即被删除。
如果你正在使用observe(.value)
或observe(.childAdded)
,以及其他人,你肯定需要在离开视图之前删除所有观察者,以保持电池寿命和内存使用量。
您可以在viewDidDisappear
或viewWillDisappear
方法中执行此操作,如下所示:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Remove your observers here:
yourRef.removeAllObservers()
}
注意:您也可以使用removeObserver(withHandle:)
方法。