我的火力点的数据结构如下所示FEventType.ChildAdded事件仅触发一次
user
|__{user_id}
|__userMatch
|__{userMatchId}
|__createdAt: <UNIX time in milliseconds>
我想监听,因为一个特定的给定时间userMatch
下孩子添加的事件。这里是我的swift代码:
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
我有以下数据插入到下用户/ {一些-ID}/userMatch火力点:
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
事件。这种情况的发生非常一致(回调总是在杀死应用程序之前调用 - 重新启动应用程序发生的事件)。
更新2:不知道为什么,但如果我将queryLimitedToLast
添加到查询中,它现在一直在运行。我的意思是,通过将userMatchRef.queryOrderedByChild("createdAt")
更改为userMatchRef.queryOrderedByChild("createdAt").queryLimitedToLast(10)
,它现在正在工作。 10
只是我选择的一个任意数字。
感谢您的意见。实际上'QGgmQnDLUB'(发生在1448934387867)比'bMfJH1bzNs'(发生在1448934354943)更新了约30秒的数据。这就是为什么我觉得我没有正确使用API或者存在Firebase SDK的错误。 –