2015-12-01 84 views
2

我的火力點的數據結構如下所示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只是我選擇的一個任意數字。

回答

1

我認爲問題來自基於時間的數據的性質。

您創建了一個查詢,說:「給我現在之後發生的所有比賽」這應該當應用程序正在運行,並且新的數據來如bMfJH1bzNs工作。但像QGgmQnDLUB這樣的舊數據不會顯示出來。

然後當您再次運行時,since.timeIntervalSince1970已更改爲以後的日期。現在,以前的任何對象都不會顯示在您的查詢中。

當您更改查詢以使用queryLimitedToLast時,您避免了此問題,因爲您不再基於時間進行查詢。現在你的查詢是這樣說的:「給我這個位置的最後十個孩子。

只要在那個位置有數據,你總會在回調中收到數據。

因此,您需要確保since.timeIntervalSince1970總是早於您期望回來的數據,或者使用queryLimitedToLast

+0

感謝您的意見。實際上'QGgmQnDLUB'(發生在1448934387867)比'bMfJH1bzNs'(發生在1448934354943)更新了約30秒的數據。這就是爲什麼我覺得我沒有正確使用API​​或者存在Firebase SDK的錯誤。 –