我试图遵循建议并在需要时删除监听器并在需要时注册监听器。所以在我的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,程序运行正常。
即使我删除了观察者,如果我不做queryOrderedByChild
和queryStartingAtValue
,该程序也可以正常运行。
那我在这里做错了什么?
答案 0 :(得分:0)
免责声明:我为Firebase工作
Firebase中的监听器特定于您在其上注册的路径或查询。调用removeAllObservers()
会删除所有观察者,但仅从该路径。
因此,在viewWillDisappear()
中,您需要从查询中删除侦听器,而不是参考。
query.removeAllObservers()
我们在文档中更明确地说明了这一点,并且正在研究如何使API更直观。
事实证明,在removeAllObservers()
上调用FFirebase
也应该删除同一位置上查询的所有观察者。它不会删除child()
位置的观察员,但应该适用于您的情况。
我们正在调查出现了什么问题,但您似乎已经遇到了iOS SDK中的错误。一旦找到它,我们将发布一个固定版本。与此同时,上述服务(并将继续服务)作为有效的解决方法。