使用 FirebaseHandle 删除 Firebase 观察者不起作用
Posted
技术标签:
【中文标题】使用 FirebaseHandle 删除 Firebase 观察者不起作用【英文标题】:Remove Firebase observers with a FirebaseHandle does not work 【发布时间】:2018-02-02 20:06:21 【问题描述】:我使用 Firebase 数据库。我关注了this article,但我不明白为什么在删除handleUserMessagesAdded
observable 之后,handleUserMessagesAdded
仍然有一个值,并且仍然观察是否有任何内容添加到数据库中。我也试过removeAllObservers
,但没有任何改变。我有什么遗漏的吗?!
class ChatController: UICollectionViewController, UICollectionViewDelegateFlowLayout
var rootRef: DatabaseReference!
var handleUserMessagesAdded: UInt!
override func viewDidLoad()
super.viewDidLoad()
rootRef = Database.database().reference()
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
observeMessages()
override func viewDidDisappear(_ animated: Bool)
super.viewDidDisappear(animated)
NotificationCenter.default.removeObserver(self)
// Remove listener with handle
rootRef.removeObserver(withHandle: handleUserMessagesAdded)
deinit
print("Deinit gets called after back button is clicked! ")
func observeMessages()
guard let uid = Auth.auth().currentUser?.uid ,let toId = user?.id else return
handleUserMessagesAdded = rootRef.child("userMessages").child(uid).child(toId).observe(.childAdded, with: [unowned self] (snapshot) in
let messageId = snapshot.key
// Make the message to be seen for this user
let childUpdates = ["/userMessages/\(uid)/\(toId)/\(messageId)": 1]
self.rootRef.updateChildValues(childUpdates)
self.rootRef.child("messages").child(messageId).observeSingleEvent(of: .value, with: [unowned self] (snapshot) in
guard let dictionary = snapshot.value as? [String: AnyObject] else return
print(dictionary)
// Reload CollectionView
, withCancel: nil)
, withCancel: nil)
【问题讨论】:
【参考方案1】:您需要在注册时使用的同一参考上致电removeObserver(withHandle: ...)
。
所以:
rootRef.child("userMessages").child(uid).child(toId).removeObserver(withHandle: handleUserMessagesAdded)
【讨论】:
谢谢。我有一个问题,当我们使用removeAllObservers
时,它不应该像您从它的名称中猜到的那样删除所有观察者,包括儿童观察者吗?!
不。它仅删除该特定 ref 上的所有观察者。以上是关于使用 FirebaseHandle 删除 Firebase 观察者不起作用的主要内容,如果未能解决你的问题,请参考以下文章
@angular/fire AngularFireStorage getDownloadUrl()
使用@angular/fire@6.0.3 无法访问firebase.firestore.FieldValue.serverTimestamp()