【发布时间】:2020-07-27 07:34:33
【问题描述】:
我已经尝试了所有方法,但数据没有按顺序排列,甚至快照也以无序的形式显示数据
我正在开发聊天应用程序。我想保持数据的顺序,所以聊天必须按顺序显示,但它没有发生。每当我发送消息时,它都会放在不在底部的旧消息之间
这里有最新消息“你在做什么?”
这里是聊天。看看最新消息“你在做什么?”在哪里?
我用于观察消息的代码
public func getAllMessagesForConversation(with id: String, completion: @escaping (Result<[Message], Error>) -> Void) {
database.child("\(id)").queryOrdered(byChild: "date").observe(.value) { (snapshot) in
guard let value = snapshot.value as? [String:Dictionary<String, Any>] else{
completion(.failure(DatabaseError.failedToFetch))
return
}
var messages = [Message]()
for i in value {
guard let message = i.value["message"] as? String else {return}
let senderId = i.value["sender"] as? String
let recieverId = i.value["reciever"] as? String
let messageID = i.value["id"] as? String
var DATE = Date()
if let date = i.value["date"] as? String {
DATE = ChatViewController.dateFormatter.date(from: date)!
}
var kind: MessageKind?
kind = .text(message)
let finalKind = kind
let sender = Sender(photoURL: "",
senderId: senderId!,
displayName: Api.Params.inputUserName)
let abc = Message(sender: sender,
messageId: messageID ?? "",
sentDate: DATE,
kind: finalKind!)
messages.append(abc)
if messages.count == value.count {
messages = messages.sorted(by: { (lhs, rhs) -> Bool in
lhs.sentDate.toMillis() > rhs.sentDate.toMillis()
})
}
print(messages)
}
completion(.success(messages))
}
}
【问题讨论】:
-
当您调用
snapshot.value时,键和值将作为字典返回,这意味着它会丢失有关排序的信息。要保留此信息,您需要循环访问snapshot.children。见stackoverflow.com/questions/40166483/…
标签: ios swift firebase-realtime-database timestamp