无法根据时间戳在聊天应用程序中检索文档

时间:2019-11-24 12:29:24

标签: ios swift firebase google-cloud-firestore

我正在使用以下代码根据时间戳在聊天应用程序中检索消息,但未按时间戳顺序进行检索,我应如何确保检索到的消息按时间戳顺序进行。

我正在为此应用程序使用Firestore数据库和Swift IOS

下面是代码部分

时间戳保存在数据库中

if cardplayed not in myhand:
    print("ect ect")

代码以检索消息

    let timestamp = Int(NSDate().timeIntervalSince1970) 

1 个答案:

答案 0 :(得分:2)

也许是一个疏忽,但是这里发生的是代码按时间戳按降序获取所需的数据,但随后又获取了相同的数据,这些数据将是无序的,因为它们是异步检索的,并添加到数组中。 >

                   func doubleGettingData() {
                      let ref = Firestore.firestore()....
Gets data ->          ref.addSnapshotListener { (snapshot, error) in
                         snapshot?.documentChanges.forEach({ (diff) in
Gets data again ->          messageRef.getDocument(completion

要添加更多上下文,问题中显示的“外部”功能实际上是按照正确的顺序获取文档。但是,由于Firebase调用是异步的,因此再次获取这些相同的文档,将以它们完成的顺序从Firebase返回它们。如果我们除去两个调用之外的所有代码,就可以证明这一点。这是一个示例Firestore结构

message_0:
   timestamp: 2
message_1
   timestamp: 0
message_2
   timestamp: 1

,当添加一些打印语句时,这就是发生的情况

outside func gets: message_0 //timestamp 2
outside func gets: message_2 //timestamp 1
outside func gets: message_1 //timestamp 0
   inside func returns: message_1 //timestamp 0
   inside func returns: message_2 //timestamp 1
   inside func returns: message_0 //timestamp 2

我会做一些修改...

这是我的Message类和用于在其中存储消息的数组

class Message {
    var text = ""
    var timestamp = ""
    convenience init(withSnap: QueryDocumentSnapshot) {
        self.init()
        self.text = withSnap.get("text") as? String ?? "No message"
        self.timestamp = withSnap.get("timestamp") as? String ?? "No Timestamp"
    }
}
var messages = [Message]()

,然后使用代码读取消息,并按时间戳降序并将它们存储在数组中。注意

  

第一个查询快照包含所有现有事件的已添加事件   符合查询条件的文档

func readMessages() {
    let ref = Firestore.firestore().collection("messages").order(by: "timestamp", descending: true)
    ref.addSnapshotListener { querySnapshot, error in
        guard let snapshot = querySnapshot else {
            print("Error fetching snapshots: \(error!)")
            return
        }

        snapshot.documentChanges.forEach { diff in
            if (diff.type == .added) {
                let snap = diff.document
                let aMessage = Message(withSnap: snap)
                self.messages.append(aMessage)
            }
            if (diff.type == .modified) {
                let docId = diff.document.documentID
                //update the message with this documentID in the array
            }
            if (diff.type == .removed) {
                let docId = diff.document.documentID
                //remove the message with this documentID from the array
            }
        }
    }
}

此代码还将监视消息中的更改和删除,并在事件发生时将该事件传递给您的应用。