首页 > 解决方案 > 如何订购与存储在firebase中相同的firebase实时数据?

问题描述

我已经尝试了一切,但数据没有按顺序排列,甚至快照也以无序的形式显示数据

我正在开发聊天应用程序。我想保持数据的顺序,所以聊天必须按顺序显示,但它没有发生。每当我发送消息时,它都会放在不在底部的旧消息之间

这里有最新消息“你在做什么?”

在此处输入图像描述

这是聊天。看看最新消息“你在做什么?”在哪里?

在此处输入图像描述

我观察消息的代码

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))
    }
}

标签: iosswiftfirebase-realtime-databasetimestamp

解决方案


问题可能是您没有包含要在 firebase 中编制索引的关键“日期”。

转到firebase控制台数据库,转到规则选项卡,输入并保存:

"emantrasports":{
   "$conversationID": {
     ".indexOn": ["date"]
   }
}

在此处输入图像描述

有一种不同的方法可以在客户端对数据进行排序。

首先,您需要创建一个消息模型,其中包含所有必要的变量以及一个日期变量。然后按您的日期变量对您的消息对象数组进行排序。


推荐阅读