【问题标题】:How to order firebase realtime data same as it is stored in firebase? [duplicate]如何订购与存储在firebase中相同的firebase实时数据? [复制]
【发布时间】: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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢兄弟的回复,在 Firebase 规则中,我有读写选项,我应该在哪里添加此代码?在哪个身体下?
  • @HanzalaRaza 我用图片更新了我的答案。看看吧。
  • 好的明白了,我需要问一件事我如何引用那个childbyautoID?您是如何发现可以使用 $conversationID 代替 childbyautoID 的?
  • @HanzalaRaza 您可以通过访问键值来获取子自动 ID。在你的情况下,它是 - i.key
  • 太棒了,非常感谢,你能帮我解决messageKit吗?每当我进入聊天屏幕时,我的消息总是出现在 viewController 之外(导航栏后面),我总是需要向下滚动以正确对齐....检查编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 2019-06-27
  • 2017-03-04
  • 2020-03-21
相关资源
最近更新 更多