Firebase,观察如何工作?

时间:2017-09-21 01:35:52

标签: ios swift firebase

老实说,我试图找出何时调用ref.removeAllObservers或ref.removeObservers,但我感到很困惑。我喂我做错了。

var noMoreDuplicators = [String]()
func pull () {
    if let myIdi = FIRAuth.auth()?.currentUser?.uid {
    let ref = FIRDatabase.database().reference()
    ref.child("users").queryOrderedByKey().observe(.value, with: { snapshot in
        if let userers = snapshot.value as? [String : AnyObject] {
            for (_, velt) in userers {
                let newUser = usera()
                if let thierId = velt["uid"] as? String {
                    if thierId != myIdi {
                if let userName = velt["Username"] as? String, let name = velt["Full Name"] as? String, let userIdent = velt["uid"] as? String {
                    newUser.name = name
                    newUser.username = userName
                    newUser.uid = userIdent

                    if self.noMoreDuplicators.contains(userIdent) {
                        print("user already added")
                    } else {
                        self.users.append(newUser)
                        self.noMoreDuplicators.append(userIdent)
                    }
                }
                    }
                }
            }
            self.tableViewSearchUser.reloadData()
        }

    })

    ref.removeAllObservers()
    }
}

在观察单个事件时,我应该只调用removeAllObservers,还是......?我什么时候打电话给它,如果打电话的话呢?

2 个答案:

答案 0 :(得分:3)

来自observe(_:with:)的官方文档:

此方法

  

用于侦听特定位置的数据更改。这是   从Firebase数据库读取数据的主要方法。你的块   将触发初始数据,并在数据时再次触发   变化。

现在,因为每次数据更改时都会触发此方法,所以它取决于您的用例,如果您想观察数据库中的更改,如果不是,请再次从官方文档中查看:

  

使用removeObserver(withHandle:)停止接收更新。

现在,如果您只想在使用observeSingleEvent(of:with:)后再观察数据库,请再次使用官方文档:

  

这相当于观察:with :,除了块   在返回初始数据后立即取消

意味着您不需要为此调用removeObserver(withHandle:),因为它会在返回初始数据后立即取消。

最后,如果您要删除所有观察者,可以使用此removeAllObserver但请注意:

  

此方法删除当前引用的所有观察者,但确实如此   不要删除子引用的任何观察者。 removeAllObservers必须   为听众所在的每个孩子参考再次调用   成立以移除观察员

答案 1 :(得分:1)

实际上,当您观察单个事件时,您不需要调用removeAllObservers,因为此观察者只会被调用一次,然后立即被删除。

如果你正在使用observe(.value)observe(.childAdded),以及其他人,你肯定需要在离开视图之前删除所有观察者,以保持电池寿命和内存使用量。

您可以在viewDidDisappearviewWillDisappear方法中执行此操作,如下所示:

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

    // Remove your observers here:

    yourRef.removeAllObservers()

}

注意:您也可以使用removeObserver(withHandle:)方法。