Ios Firebase与';listen()为同一查询调用了两次';错误

Ios Firebase与';listen()为同一查询调用了两次';错误,ios,swift,firebase,Ios,Swift,Firebase,我试图按照建议,在需要时删除侦听器,并在需要时注册侦听器。因此,在我的UIViewController.ViewDid中,我有以下内容: let chatRef = messagesRef.childByAppendingPath(chat.objectId!) var query = chatRef.queryOrderedByChild("createdAt") if let since = since { query = query.queryStartingAtValue(sin

我试图按照建议,在需要时删除侦听器,并在需要时注册侦听器。因此,在我的UIViewController.ViewDid中,我有以下内容:

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.viewWillEnglish()中,我有

但是,每次第二次输入ViewController(转到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,而不是在viewdide中调用一次,程序运行正常

即使我删除了观察者,但如果我不执行
queryorderdbychild
queryStartingAtValue
操作,程序也可以正常运行

那么我做错了什么呢?

免责声明:我为Firebase工作

Firebase中的侦听器特定于您注册它们的路径或查询。调用
removeAllObservers()
将删除所有观察者,但仅从该路径中删除

因此,在您的
视图willEnglish()
中,您需要从查询中删除侦听器,而不是ref

query.removeAllObservers()
我们只是在文档中更加明确了这一点,并正在寻找使API更加直观的方法

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

我们正在调查出了什么问题,但似乎您在我们的iOS SDK中遇到了一个bug。一旦我们找到它,我们将发布一个固定版本。同时,上述内容(并将继续)作为有效的解决办法。

免责声明:我为Firebase工作

Firebase中的侦听器特定于您注册它们的路径或查询。调用
removeAllObservers()
将删除所有观察者,但仅从该路径中删除

因此,在您的
视图willEnglish()
中,您需要从查询中删除侦听器,而不是ref

query.removeAllObservers()
我们只是在文档中更加明确了这一点,并正在寻找使API更加直观的方法

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


我们正在调查出了什么问题,但似乎您在我们的iOS SDK中遇到了一个bug。一旦我们找到它,我们将发布一个固定版本。同时,上述措施(并将继续)是一种有效的解决办法。

现在起作用了。谢谢所以,如果我不使用query,我应该调用
Firebase.removeAllObservers()
,如果我使用query,我应该调用
FQuery.removeAllObservers()
,决不能两者都调用。对吗?(如果我同时执行这两项操作,程序似乎也会崩溃)您需要删除每个
FQuery
和注册观察员的每个
Firebase
上的所有观察员。因此,如果您在这两个站点上注册了观察者,则需要在这两个站点上删除它们。但是您的代码片段只在查询中观察到,因此您只需调用
query.removeAllObservers()
。我仍然遇到这个问题。有解决办法吗??我已经尝试在我的所有查询和引用上调用RemoveAllobserver,但仍然收到相同的错误。它现在可以工作了。谢谢所以,如果我不使用query,我应该调用
Firebase.removeAllObservers()
,如果我使用query,我应该调用
FQuery.removeAllObservers()
,决不能两者都调用。对吗?(如果我同时执行这两项操作,程序似乎也会崩溃)您需要删除每个
FQuery
和注册观察员的每个
Firebase
上的所有观察员。因此,如果您在这两个站点上注册了观察者,则需要在这两个站点上删除它们。但是您的代码片段只在查询中观察到,因此您只需调用
query.removeAllObservers()
。我仍然遇到这个问题。有解决办法吗??我曾尝试在所有查询和引用上调用RemoveAllobserver,但仍然出现相同的错误。