FEventType.ChildAdded事件只触发一次

时间:2015-12-01 05:10:39

标签: ios swift firebase

我的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只是我选择的任意数字。

1 个答案:

答案 0 :(得分:1)

我认为问题来自基于时间的数据的性质。

您创建了一个查询:&#34; 获取我之后发生的所有匹配。&#34;当应用程序正在运行并且新数据像bMfJH1bzNs一样进入时,这应该有效。但是像QGgmQnDLUB这样的旧数据却不会出现。

然后当您再次运行时,since.timeIntervalSince1970已更改为更晚的日期。现在,以前的任何对象都不会显示在您的查询中。

当您更改查询以使用queryLimitedToLast时,您避免了此问题,因为您不再根据时间查询。现在您的查询说:&#34; 让我在这个位置找到最后十个孩子。&#34;

只要该位置有数据,您就会始终在回调中接收数据。

因此,您需要确保since.timeIntervalSince1970始终早于您希望返回的数据,或使用queryLimitedToLast