【发布时间】:2015-07-23 23:07:42
【问题描述】:
我试图听从建议并在需要时删除监听器并在需要时注册监听器。所以在我的 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,则将其添加回来。
那么我在这里做错了什么?
【问题讨论】: