【问题标题】:Firebase, how do I return a handle so that I can call removeObserver?Firebase,我如何返回一个句柄以便我可以调用 removeObserver?
【发布时间】:2016-11-29 01:59:44
【问题描述】:

这是我的观察事件代码:

let databaseRef = FIRDatabase.database().reference()
            let query = databaseRef.child("palettes").queryOrdered(byChild: UserDefaults.standard.string(forKey: "UserTypeState")!).queryEqual(toValue: modifiedColor.hexValue())
            // Change the value to the value of the color.

            query.observe(.childAdded, with: { (snapshot) in
                let URL = snapshot.childSnapshot(forPath: "URL").value as! String
                self.URLArrayString.append(URL)

                self.collectionView?.reloadData() //Reloads data after the number and all the URLs are fetched
                self.noResultsLabel.isHidden = true
            })

如何在调用特定观察者时检索句柄,以便在 viewDidDissapear 时将其删除?

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    当您调用observe 时,它会向注册的观察者返回一个句柄。

    您将此句柄传递给removeObserverWithHandle() 以删除观察者。

    let handle = query.observe(.childAdded, with: { (snapshot) in
        ....
    })
    

    然后:

    query.removeObserverWithHandle(handle)
    

    【讨论】:

    • 您好!我之前尝试过 ping 你,但我不确定我是否正确执行。所以这是我想给你的信息:你知道我的问题的答案吗:stackoverflow.com/questions/40223230/…
    • 谢谢,这正是我所需要的。
    【解决方案2】:

    在 Swift 3 中我正在使用

     deinit {
     refName.removeAllObserver()
     }
    

    其中 refName 是您的参考名称。

    还有另一种选择:

    private var updatedMessageRefHandle: FIRDatabaseHandle?
    ...
    ...
    deinit {
    if let refHandle = newMessageRefHandle {
    messageRef.removeObserver(withHandle: refHandle)
    }
    if let refHandle = updatedMessageRefHandle {
    messageRef.removeObserver(withHandle: refHandle)
    }} 
    

    但在第二种情况下,您必须在代码中描述 refHandle。

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 2019-07-03
      • 1970-01-01
      • 2013-07-04
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      相关资源
      最近更新 更多