Firebase崩溃与' listen()在同一查询中被调用两次'错误

时间:2015-07-23 23:07:43

标签: ios swift firebase

我试图遵循建议并在需要时删除监听器并在需要时注册监听器。所以在我的UIViewController.viewDidAppear中我有以下内容:

let chatRef = messagesRef.childByAppendingPath(chat.objectId!)
var query = chatRef.queryOrderedByChild("createdAt")
if let since = since {
    query = query.queryStartingAtValue(since.timeIntervalSince1970 * 1000)
}
let handle = query.observeEventType(FEventType.ChildAdded, withBlock: completion, withCancelBlock: { (error: NSError!) -> Void in
    println("error listening for new Chat messages: \(error)")
});

在我的UIViewController.viewWillDisappear()中我有

let chatRef = messagesRef.childByAppendingPath(chat.objectId!)
if chatRef != nil {
    chatRef.removeAllObservers()
}

但每次ViewController第二次进入时(程序控制器导航,导航,然后返回)程序都会崩溃,并出现以下错误:

*** Assertion failure in -[FPersistentConnection listen:tagId:hashFn:onComplete:], /Users/mtse/Dev/firebase/firebase-client-objc/Firebase/Firebase/Core/FPersistentConnection.m:127
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'listen() called twice for the same query'

如果我不删除观察者并且只在viewDidLoad中调用observeEventType而不是viewDidAppear,程序运行正常。

即使我删除了观察者,如果我不做queryOrderedByChildqueryStartingAtValue,该程序也可以正常运行。

那我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

免责声明:我为Firebase工作

Firebase中的监听器特定于您在其上注册的路径或查询。调用removeAllObservers()会删除所有观察者,但仅从该路径

因此,在viewWillDisappear()中,您需要从查询中删除侦听器,而不是参考。

query.removeAllObservers()

我们在文档中更明确地说明了这一点,并且正在研究如何使API更直观。

更新(20150724)

事实证明,在removeAllObservers()上调用FFirebase也应该删除同一位置上查询的所有观察者。它不会删除child()位置的观察员,但应该适用于您的情况。

我们正在调查出现了什么问题,但您似乎已经遇到了iOS SDK中的错误。一旦找到它,我们将发布一个固定版本。与此同时,上述服务(并将继续服务)作为有效的解决方法。