我的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
只是我选择的任意数字。
答案 0 :(得分:1)
我认为问题来自基于时间的数据的性质。
您创建了一个查询:&#34; 获取我之后发生的所有匹配。&#34;当应用程序正在运行并且新数据像bMfJH1bzNs
一样进入时,这应该有效。但是像QGgmQnDLUB
这样的旧数据却不会出现。
然后当您再次运行时,since.timeIntervalSince1970
已更改为更晚的日期。现在,以前的任何对象都不会显示在您的查询中。
当您更改查询以使用queryLimitedToLast
时,您避免了此问题,因为您不再根据时间查询。现在您的查询说:&#34; 让我在这个位置找到最后十个孩子。&#34;
只要该位置有数据,您就会始终在回调中接收数据。
因此,您需要确保since.timeIntervalSince1970
始终早于您希望返回的数据,或使用queryLimitedToLast
。