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

标签 swift firebase firebase-realtime-database

在 Swift 3 中使用 removeObserver(withHandle,不会在 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!) 作为来自 Firebase, how do I return a handle so that I can call removeObserver? 的回答作者:弗兰克范普菲伦

唯一可行的是尝试 4 中概述的那个。 我无法使用 removeObserver(withHandle? (try 1 - 3)) 删除 Observer 的任何原因

“query.queryLimited(toFirst: UInt(count)).observe(.childAdded”也没有从 Firebase 获取最新数据。我的印象是 observe 总是获取更新的数据,而不是 observeSingleEvent。为什么它不这样做吗?

非常感谢任何建议。

最佳答案

如果你有如下代码:

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!)

它移除了观察者。这是经过测试的代码。

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

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

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

.childAdded:当任何 child 被添加到节点时 .childChanges:当节点中的任何 child 发生变化时 .childRemoved:当一个 child 被移除时。

关于swift - 使用 Firebase,Swift removeObserver(withHandle 不会删除观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43634926/

相关文章:

swift - 快速指针?

android - 默认情况下,Firebase 动态链接始终使用第一个域 url 前缀来发送身份验证电子邮件

ios - 带有 ios 和 xcode 的 firebase "clang: error: linker command failed"

firebase - 使用 Firebase 数据库实现 "Tag"功能的最佳方法是什么?

android - 如何从 firebase 数据中获取特定的键值?

ios - 如何更新 Firebase-Database 树中的最新条目?

ios - CoreData、NSPredicate 和 fetchRequest 令人费解的行为 - 或者只是我?

swift - 在 Swift 中,我可以在变量名或枚举符号的开头使用 $ 吗?

ios - 火力地堡 IOS : Warning "setScreenName:screenClass: must be called after a view controller has appeared"

ios - 何时使用 respondsToSelector 与 objc_getClass