我注意到FIRServerValue.timestamp()
创建的对象的下载时间戳与在线版本略有不同。我的代码:
let messagesRef = self.ref.child("messages").child(chatId)
messagesRef
.queryOrderedByChild("timestamp")
.queryLimitedToLast(500)
.observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in
guard let object = snapshot.value as? [String: AnyObject] else { return }
let messageId = snapshot.key
if let
senderId = object["senderId"] as? String,
senderName = object["senderName"] as? String,
senderEmail = object["senderEmail"] as? String,
timestamp = object["timestamp"] as? NSTimeInterval {
let date = timestamp.toDate()
let text = object["text"] as? String
print("text: \(text) - timestamp: \(timestamp)")
}
})
以下是与在线值(由->
标记)比较的示例输出:
text: Optional("1") - timestamp: 1471596374007.0 -> 1471596374874
text: Optional("2") - timestamp: 1471596375044.0 -> 1471596375324
text: Optional("3") - timestamp: 1471596376157.0 -> 1471596376461
text: Optional("4") - timestamp: 1471596461213.0 -> 1471596463220
text: Optional("5") - timestamp: 1471596542659.0 -> 1471596543307
我有时会遇到一条消息,即消息在另一条消息之前出现,即使它已在该特定消息之后发送。我认为它与这种行为有关。如果检索到的时间戳不准确,那么及时发送的消息可以采用不同的方式排序。
答案 0 :(得分:3)
根据documentation,当您指定服务器时间戳时,发送到服务器的数据包含:
自Unix纪元以来毫秒数的占位符值。
该占位符将替换为服务器的时间戳。但是,如果您在添加数据的设备上有ChildAdded
个侦听器,那么这些侦听器在本地通知 - 这将涉及用本地时间戳替换占位符。我怀疑这就是为什么你看到通过监听器报告的内容 - 写入消息时 - 与控制台上显示的内容之间存在差异的原因。这也是为什么读取的值与控制台中显示的值相匹配的原因。
Firebase可能会考虑本地和服务器时钟之间的偏移 - 因为它在生成推送数据的密钥时会考虑到这一点 - 但是您仍然会得到一个小的差异,因为数据需要一些时间到达服务器。
此事件的本地触发也是您有时可能会以意外顺序看到ChildAdded
事件触发的原因。我几天前answered a question regarding unexpected snapshot ordering。