使用Firebase,Swift removeObserver(withHandle不会删除观察者 [英] With Firebase, Swift removeObserver(withHandle does not remove the observer

查看:67
本文介绍了使用Firebase,Swift removeObserver(withHandle不会删除观察者的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用removeObserver(在Swift 3中为withHandle时,不会在viewDidDisappear上删除Observer

With removeObserver(withHandle in Swift 3, the Observer is not removed on viewDidDisappear

var query = FIRDatabaseQuery()

var postRef: FIRDatabaseReference!
var postRefHandle: FIRDatabaseHandle?

override func viewDidLoad() {
    super.viewDidLoad()

    postRef = baseRef.child("Posts")
}

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

    if postRefHandle != nil {
        //try 1:
        //postRef.removeObserver(withHandle: postRefHandle!)

        //try 2:
        //postRef.queryOrdered(byChild: "sortTimestamp").removeObserver(withHandle: postRefHandle!)

        //try 3: 
        //query.removeObserver(withHandle: postRefHandle!)
    }
    //try 4:
    //postRef.removeAllObservers() //works
}

func getPosts()
{
    var count = 20 

    query = postRef.queryOrdered(byChild: "sortTimestamp")

    postRefHandle = query.queryLimited(toFirst: UInt(count)).observe(.childAdded //etc.
}

因此,我尝试了viewDidDisappear中的三个方法,但没有删除观察者. 尝试3 query.removeObserver(withHandle:postRefHandle!)作为

So I tried the three methods in viewDidDisappear, but the observer is not removed. try 3 query.removeObserver(withHandle: postRefHandle!) as by answer from Firebase, how do I return a handle so that I can call removeObserver? by frank-van-puffelen

唯一有效的方法是尝试4中概述的方法. 为什么无法使用removeObserver(withHandle?(尝试1-3)

The only one that does work is the one outlined in try 4. Any reason why I cannot remove the Observer with removeObserver(withHandle? (try 1 - 3)

"query.queryLimited(toFirst:UInt(count)).observe(.childAdded)"也无法从Firebase获取最新数据.不是吗?

Also "query.queryLimited(toFirst: UInt(count)).observe(.childAdded" does not get the latest data from Firebase. I was under the impression the observe always gets the updated data, as opposed to observeSingleEvent. Why does it not do that?

任何建议都值得赞赏.

推荐答案

如果您具有以下代码:

var postsRef: FIRDatabaseReference!
var postRefHandle: FIRDatabaseHandle!
var query = FIRDatabaseQuery()

func addHandler() {

    self.postsRef = self.ref.child("posts")
    var count = 20
    self.query = self.postsRef.queryOrdered(byChild: "sortTimestamp")

    self.postRefHandle = self.query.queryLimited(toFirst: UInt(count)).observe(.childAdded, with: { snapshot in
        print(snapshot) 
    })
}

稍后再执行此功能

self.postsRef.removeObserver(withHandle: self.postRefHandle!)

它删除观察者.这是经过测试的代码.

It removes the observer. This is tested code.

问题的第二部分:querySingleEvent和观察数据明智地执行相同的操作,但行为不同.它们都将始终获取当前数据-由startAt,endAt,equalTo等修改.

To the second part of your question: querySingleEvent and observe do the same thing data wise but have different behaviors. They will both always get current data - modified by startAt, endAt, equalTo etc.

observeSingleEvent返回数据,不离开观察者,所以您 如果该数据发生更改,则不会收到通知

observeSingleEvent returns the data, does NOT leave an observer so you will not be notified if that data changes

observe返回数据并将观察者附加到该节点 并会通知您将来的更改.

observe returns the data and leaves an observer attached to the node and will notify you of future changes.

.childAdded:将任何子级添加到节点时 .childChanges:当节点中的任何子级发生更改时 .childRemoved:删除孩子时.

.childAdded: when any children are added to the node .childChanges: when any children change in the node .childRemoved: when a child is removed.

这篇关于使用Firebase,Swift removeObserver(withHandle不会删除观察者的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆