Ios Firebase:下载的时间戳由FIRServerValue创建。时间戳()与在线版本略有不同

Ios Firebase:下载的时间戳由FIRServerValue创建。时间戳()与在线版本略有不同,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我注意到由FIRServerValue.timestamp()创建的对象的下载时间戳与在线版本略有不同。我的代码: let messagesRef = self.ref.child("messages").child(chatId) messagesRef .queryOrderedByChild("timestamp") .queryLimitedToLast(500) .observeEventType(.ChildAdded,

我注意到由
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)")
            }
    })
以下是与在线值(由
->
标记)进行比较的示例输出:

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

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

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

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

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


这种事件的本地触发也是您有时可能看到
ChildAdded
事件以意外顺序触发的原因。我几天前就知道了。

你说的“在线值”是什么意思?保存到实时数据库的值。那么“在线值”就是你在Firebase控制台中看到的值?包含
时间戳的
ChildAdded
事件是否与您创建新消息或读取现有消息时触发的“在线值”不同?是的,我指的是Firebase控制台中存储的值。关于您关于
ChildAdded
:我刚刚检查了在另一台设备上创建消息时,检索到的
时间戳实际上与在线版本相同。然而,当它们从同一个设备发送时,小的差异就会显现出来。可能是因为FIRDatabase.database().persistenceEnabled=true
?顺便说一句:通过调用messages ref上的
setValue
保存消息。Edit:Nope,禁用持久性没有帮助。问题仍然存在。问题的解决方案不仅是响应
.ChildAdded
,而且还响应
.ChildChanged
。有关流程的逐步解释,请参见我对该问题的回答:
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