我正在使用以下代码根据时间戳在聊天应用程序中检索消息,但未按时间戳顺序进行检索,我应如何确保检索到的消息按时间戳顺序进行。
我正在为此应用程序使用Firestore数据库和Swift IOS
下面是代码部分
时间戳保存在数据库中
if cardplayed not in myhand:
print("ect ect")
代码以检索消息
let timestamp = Int(NSDate().timeIntervalSince1970)
答案 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
}
}
}
}
此代码还将监视消息中的更改和删除,并在事件发生时将该事件传递给您的应用。