我的火力點的數據結構如下所示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的錯誤。 –