2015-12-01 59 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的错误。 –