【问题标题】:swift Firebase remove observer快速 Firebase 删除观察者
【发布时间】:2017-09-07 18:58:24
【问题描述】:

我注意到喜欢或不喜欢的打印在我打开视图控制器时被触发多次,所以我在 viewDidDisappear 中添加了一个删除观察者(我尝试了所有列出的),但它继续触发多次,有人可以帮助我吗?

这是我的代码:

 private var databaseHandle: FIRDatabaseHandle!
 var ref = FIRDatabase.database().reference()
 var isLiked: Bool = false
  override func viewDidLoad() {
        super.viewDidLoad()

isLiked = false

databaseHandle = ref.child("favperuser").child(FIRAuth.auth()!.currentUser!.uid).observe( .value, with:{(snap) in

            if snap.hasChild(self.detailId){

                print("is liked")
                self.isLiked = true
                 self.likeButton.setTitle("Unlike", for: .normal)

                self.likeButton.setImage(UIImage(named: "star-")?.withRenderingMode(.alwaysOriginal), for: .normal)
                self.likeButton.setImage(UIImage(named: "star-")?.withRenderingMode(.alwaysOriginal), for: .highlighted)

            }else{

                print("not liked")
                self.isLiked = false
                self.likeButton.setTitle("Like!", for: .normal)

                self.likeButton.setImage(UIImage(named: "star+")?.withRenderingMode(.alwaysOriginal), for: .normal)
                self.likeButton.setImage(UIImage(named: "star+")?.withRenderingMode(.alwaysOriginal), for: .highlighted)

            }


          })
        self.isLiked = false

}


      @IBAction func likePressed(_ sender: UIButton) {


        if self.isLiked == false {

            ref.child("favperuser").child( FIRAuth.auth()!.currentUser!.uid).updateChildValues([detailId: true])


        } else {


            ref.child("favperuser").child( FIRAuth.auth()!.currentUser!.uid).child(detailShellId).removeValue { (error, ref) in
                if error != nil {
                    print("error \(error)")
                }
            }



        }

    }



    override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)

    ref.removeObserver(withHandle: databaseHandle)

    ref.child("favperuser").removeObserver(withHandle: databaseHandle)
    ref.child("favperuser").child(FIRAuth.auth()!.currentUser!.uid).removeObserver(withHandle: databaseHandle)
}

【问题讨论】:

  • viewDidDisappear 实际调用了吗?
  • 是的,有一个关闭功能,反正我也把卸妆器放在了关闭功能里面,没有任何改变
  • 你确定你没有在每次 VC 演示中多次调用 observe 吗?这可以解释为什么您似乎无法删除 all 观察者(实际上只是删除了最后一个注册的观察者)。
  • 我试图在 wiewDisapper 函数中只留下 ref.child("favperuser").child(FIRAuth.auth()!.currentUser!.uid).removeObserver(withHandle: databaseHandle)作品

标签: ios swift firebase


【解决方案1】:

请参考此链接:-

https://firebase.google.com/docs/database/ios/read-and-write#detach_listeners

此外,在处理程序删除所有引用后,只需 removeAllObservers 为该 ref 以防任何观察者离开并且它可能会继续同步,并且它应该主要在从 firebase 接收到快照后被删除,因为我也面临同样的问题解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多