【发布时间】:2015-12-01 05:10:39
【问题描述】:
我的 firebase 数据结构如下所示
user
|__{user_id}
|__userMatch
|__{userMatchId}
|__createdAt: <UNIX time in milliseconds>
自特定时间以来,我正在尝试侦听 userMatch 下的子添加事件。这是我的快速代码:
func listenForNewUserMatches(since: NSDate) -> UInt? {
NSLog("listenForNewUserMatches since: \(since)")
var handle:UInt?
let userMatchRef = usersRef.childByAppendingPath("\(user.objectId!)/userMatch")
var query = userMatchRef.queryOrderedByChild("createdAt");
query = query.queryStartingAtValue(since.timeIntervalSince1970 * 1000)
handle = query.observeEventType(FEventType.ChildAdded, withBlock: { snapshot in
let userMatchId = snapshot.key
NSLog("New firebase UserMatch created \(userMatchId)")
}, withCancelBlock: { error in
NSLog("Error listening for new userMatches: \(error)")
})
return handle
}
发生的事情是事件回调只被调用一次。 userMatch 下的后续数据插入没有触发调用。有点像observeSingleEventOfType
我在 user/{some-id}/userMatch 下的 firebase 中插入了以下数据:
QGgmQnDLUB
createdAt: 1448934387867
bMfJH1bzNs
createdAt: 1448934354943
这里是日志:
2015-11-30 17:32:38.632 listenForNewUserMatches since:2015-12-01 01:32:37 +0000
2015-11-30 17:45:55.163 New firebase UserMatch created bMfJH1bzNs
为bMfJH1bzNs 触发了回调,但没有为稍后添加的QGgmQnDLUB 触发回调。这是非常一致的:打开应用程序后,它只触发第一个事件。不知道我在这里做错了什么。
更新:实际上行为不是很一致。有时回调根本没有被触发,甚至一次都没有。但是由于我坚持since 时间,我应该在调用listenForNewUserMatches 函数时使用。如果我杀死应用程序并重新启动应用程序,回调将被触发(在应用程序启动时调用listenForNewUserMatches),在我杀死应用程序之前的childAdded 事件。这种情况非常一致地发生(对于杀死应用程序之前发生的事件,总是在 kill-restart 应用程序时调用回调)。
更新 2:不知道为什么,但如果我将 queryLimitedToLast 添加到查询中,它现在一直有效。我的意思是,通过将userMatchRef.queryOrderedByChild("createdAt") 更改为userMatchRef.queryOrderedByChild("createdAt").queryLimitedToLast(10),它现在可以工作了。 10 只是我选择的任意数字。
【问题讨论】: