【问题标题】:Remove Firebase observers with a FirebaseHandle does not work使用 FirebaseHandle 删除 Firebase 观察者不起作用
【发布时间】: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)
  }

}

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    您需要在注册时使用的同一参考上致电removeObserver(withHandle: ...)

    所以:

    rootRef.child("userMessages").child(uid).child(toId).removeObserver(withHandle: handleUserMessagesAdded)
    

    【讨论】:

    • 谢谢。我有一个问题,当我们使用removeAllObservers 时,它不应该像您从它的名称中猜到的那样删除所有观察者,包括儿童观察者吗?!
    • 不。它仅删除该特定 ref 上的所有观察者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多