Firebase:FIRServerValue.timestamp()创建的下载时间戳与在线版

时间:2016-08-19 09:02:04

标签: ios swift firebase firebase-realtime-database

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

我有时会遇到一条消息,即消息在另一条消息之前出现,即使它已在该特定消息之后发送。我认为它与这种行为有关。如果检索到的时间戳不准确,那么及时发送的消息可以采用不同的方式排序。

1 个答案:

答案 0 :(得分:3)

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

  

自Unix纪元以来毫秒数的占位符值。

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

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

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