使用 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 观察者不起作用的主要内容,如果未能解决你的问题,请参考以下文章

python fire库的使用

Fire TV / Fire OS 的 Google 登录

fire-spark使用说明

@angular/fire AngularFireStorage getDownloadUrl()

使用@angular/fire@6.0.3 无法访问firebase.firestore.FieldValue.serverTimestamp()

在 VScode 中找不到 @angular/fire/firestore 模块错误