Firebase,如何返回句柄以便我可以调用removeObserver?

时间:2016-10-31 16:35:26

标签: swift firebase firebase-realtime-database

这是我的观察事件代码:

let databaseRef = FIRDatabase.database().reference()
            let query = databaseRef.child("palettes").queryOrdered(byChild: UserDefaults.standard.string(forKey: "UserTypeState")!).queryEqual(toValue: modifiedColor.hexValue())
            // Change the value to the value of the color.

            query.observe(.childAdded, with: { (snapshot) in
                let URL = snapshot.childSnapshot(forPath: "URL").value as! String
                self.URLArrayString.append(URL)

                self.collectionView?.reloadData() //Reloads data after the number and all the URLs are fetched
                self.noResultsLabel.isHidden = true
            })

如何在调用特定观察者时检索句柄,以便在viewDidDissapear时将其删除?

2 个答案:

答案 0 :(得分:2)

当你致电observe时,它会返回已注册观察者的句柄。

您将此句柄传递给removeObserverWithHandle()以移除观察者。

let handle = query.observe(.childAdded, with: { (snapshot) in
    ....
})

然后:

query.removeObserverWithHandle(handle)

答案 1 :(得分:0)

在Swift 3中我正在使用

 deinit {
 refName.removeAllObserver()
 }

其中refName是您的引用名称。

还有另一种选择,使用:

private var updatedMessageRefHandle: FIRDatabaseHandle?
...
...
deinit {
if let refHandle = newMessageRefHandle {
messageRef.removeObserver(withHandle: refHandle)
}
if let refHandle = updatedMessageRefHandle {
messageRef.removeObserver(withHandle: refHandle)
}} 

但在第二种情况下,您必须在代码中描述refHandle。