Firebase,如何观察作品?

问题描述:

我老实说,我试图找出何时调用ref.removeAllObservers或ref.removeObservers,但我很困惑。我喂我在这里做错了什么。Firebase,如何观察作品?

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,或者......?我应该什么时候打电话呢,如果打电话呢?

从正式文档observe(_:with:)

此方法

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

现在,因为该方法将被触发每次数据的变化,所以它从官方文档也取决于你的用例,如果你想观察在数据库中的变化,以及,如果没有的话:

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

现在,如果你只是想观察一次数据库使用observeSingleEvent(of:with:),再从官方文档:

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

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

现在最后,如果要删除所有观察者,你可以使用这个removeAllObserver但要注意的是:

此方法删除在当前参考的所有观察员,但 不会删除在孩子引用任何观察员。removeAllObservers必须 对于其中一个侦听器 成立去除观察员

+1

非常感谢你向我解释 –

其实,你并不需要调用removeAllObservers当你观察到一个单一的事件,因为这种观测得到的只是调用一次,然后立即删除。

如果您使用的是observe(.value)observe(.childAdded)等等,您肯定需要在离开视图之前移除所有观察者以保留电池寿命和内存使用情况。

你会做的viewDidDisappearviewWillDisappear方法中,像这样:

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

    // Remove your observers here: 

    yourRef.removeAllObservers() 

} 

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

+0

感谢您对这个答案每个孩子基准再次呼吁,这真的帮助。 –

+0

可以在视图控制器外部运行观察器,就像在视图中不removeObserver会消失一样吗? –

+0

非常欢迎@GavinW! – Alex