使用Firebase,Swift removeObserver(withHandle不会删除观察者

Pet*_*ies 5 firebase swift firebase-realtime-database

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

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.
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试了viewDidDisappear中的三个方法,但是没有删除观察者.尝试3来自Firebase的 query.removeObserver(withHandle:postRefHandle!),如何返回句柄以便我可以调用removeObserver?作者:frank-van-puffelen

唯一有效的是try 4中概述的那个.我无法用removeObserver删除Observer的任何原因(withHandle?(try 1 - 3)

另外"query.queryLimited(toFirst:UInt(count)).观察(.childAdded"没有从Firebase获取最新数据.我认为观察总是得到更新的数据,而不是observeSingleEvent.为什么不是去做?

任何建议都非常感谢.

Jay*_*Jay 9

如果您有以下代码:

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) 
    })
}
Run Code Online (Sandbox Code Playgroud)

以后你会做这个功能

self.postsRef.removeObserver(withHandle: self.postRefHandle!)
Run Code Online (Sandbox Code Playgroud)

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

对于问题的第二部分:querySingleEvent和observe在数据方面做同样的事情,但有不同的行为.它们都将始终获得当前数据 - 由startAt,endAt,equalTo等修改.

observeSingleEvent返回数据,不会留下观察者,因此如果数据发生变化,您将不会收到通知

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

.childAdded:当任何子节点被添加到节点时.childChanges:当节点中的任何子节点发生变化时.childRemoved:删除子节点时.