gpt4 book ai didi

ios - Firebase:由 FIRServerValue.timestamp() 创建的下载时间戳与在线版本略有不同

转载 作者:可可西里 更新时间:2023-11-01 00:58:36 25 4
gpt4 key购买 nike

我注意到由 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

我有时会遇到一个错误,即一条消息出现在另一条消息之前,即使它是在该特定消息之后发送的。我认为这与这种行为有关。当检索到的时间戳不准确时,发送时间彼此接近的消息可以按不同顺序排列。

最佳答案

根据documentation ,当您指定服务器时间戳时,发送到服务器的数据包含:

Placeholder value for the number of milliseconds since the Unix epoch.

该占位符将替换为服务器的时间戳。但是,如果您在添加数据的设备上有 ChildAdded 监听器,这些监听器将本地通知 - 这将涉及用本地时间戳替换占位符。我怀疑这就是为什么您看到通过监听器报告的内容(写入消息时)与控制台上显示的内容之间存在差异的原因。这也是读取的值与控制台中显示的值匹配的原因。

Firebase 可能会考虑本地时钟和服务器时钟之间的偏移 - 因为它在为推送数据生成 key 时会考虑到这一点 - 但你仍然会得到一个小差异,因为数据需要一些时间到达服务器。

这种本地事件触发也是您有时可能会看到 ChildAdded 事件以意外顺序触发的原因。我 answered a question regarding unexpected snapshot ordering几天前。

关于ios - Firebase:由 FIRServerValue.timestamp() 创建的下载时间戳与在线版本略有不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39035047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com