Ios Swift使用firebase显示聊天中最后发送的消息

Ios Swift使用firebase显示聊天中最后发送的消息,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我试图在聊天室messenger的主屏幕上显示我上次发送的消息,从情节提要上看,它如下所示: 我使用的代码是: func getAllMsg() { self.users = [] let fromId = Auth.auth().currentUser!.uid let ref = Database.database().reference().child("privateMessages").child(fromId) ref.observeSingleE

我试图在聊天室messenger的主屏幕上显示我上次发送的消息,从情节提要上看,它如下所示:

我使用的代码是:

func getAllMsg() {
    self.users = []
    let fromId = Auth.auth().currentUser!.uid
    let ref = Database.database().reference().child("privateMessages").child(fromId)

    ref.observeSingleEvent(of: .value) { (snapshot) in
        for snap in snapshot.children.allObjects as! [DataSnapshot] {
            // retrieving receiver's ID
            let chatUserID = snap.key

            let ref2 = Database.database().reference().child("users").child(chatUserID)

            // to retrieve message ID
            ref2.observeSingleEvent(of: .value, with: { (snapshot2) in
                let newUser = User(dictionary: snapshot2.value as! [String: AnyObject])
            // to get the last message
            ref.child(chatUserID).queryLimited(toLast: 1).observeSingleEvent(of: .value, with: { (snapshot3) in

                let value = snapshot3.children

                while let rest = value.nextObject() as? DataSnapshot {
                    newUser.lastMessage = (rest.value as! [String: AnyObject])["textMessages"] as? String

                    self.users.append(newUser)

                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                        }
                    break
                    }
                })
            })
        }
    }
}
我已经对我的数据库做了一些更改,上面的代码可以正常工作,但是在我改变了我的数据库工作方式之后,它就不再工作了 以前,我的firebase看起来像

现在我的firebase看起来像:


我使用发送和接收ID创建了聊天室ID。但是我现在无法显示上次发送的消息,该消息应该显示在我的主屏幕上。我能做些什么?或者我获取数据库的方式不对?

您需要以不同的方式设置房间


如果一个房间里有3个人,那么室友是什么?如果有人离开房间,您如何知道房间历史记录是什么?

根据数据库结构,您的查询是错误的。也不要在其他查询的块内执行
lastMessage
查询,因为这是完全独立的查询,与任何查询都不相关。下面的一段代码将适用于您

let ref = kFirDefaultDatabase.reference().child("yourChatRoomId").queryOrdered(byChild: "fromId").queryEqual(toValue: "0YfqnPIOYFYKb8cYZMHnSYti62i2").queryLimited(toLast: 1)
ref.observeSingleEvent(of: DataEventType.value) { (snapshot) in
     if snapshot.exists() {
        print(snapshot.value)
     }
}
这将获取请求的聊天室ID的
fromId
发送的最后一条消息。有关更多详细信息,请查看文档

如果您想在表中为所有用户(如
WhatsApp
或其他聊天应用程序)执行此操作,则需要制作一个额外的表
LastMessages
,并将每个
聊天室ID
对应的最后一条消息信息保存在此处,或者如果可能,将此详细信息保存在您可以使用
tableData
,这样您就不需要在循环中查询每个
聊天室

你可以做一些更好的事情使它更快。每当您发送或接收任何消息时,使用
CoreData
Sqlite
并将
lastMessage
信息保存/更新到
local db
,其中
聊天室ID
将是
主键
,首先从
本地数据库
获取信息,并立即显示在
中,同时您可以从服务器获取数据,更新
本地数据库
并刷新

编辑:用于评论
以获取最后一封邮件,无论我发送给收件人还是收件人发送给我

删除
orderBy
查询,只需使用
limitToLast
。见以下代码:

let ref = kFirDefaultDatabase.reference().child("yourChatRoomId").queryLimited(toLast: 1)
ref.observeSingleEvent(of: DataEventType.value) { (snapshot) in
     if snapshot.exists() {
         print(snapshot.value)
     }
}

不要在循环中使用查询。只需转到聊天室ID
并执行
.queryLimited(toLast:1)
。这应该是单独执行的,而不是在循环中。我认为我的代码有点乱,我去了消息数据库,得到了密钥…然后到了用户数据库,然后得到了最后一条消息…混乱…上面的代码我应该删除吗?你只需要一个查询就可以了。代码就在//下面,以获取您编写的最后一行消息
chatRoomIdRef.isEqualTo(userId).queryLimited(toLast:1)
类似的内容。未获取它。。你有什么我可以查的参考资料吗?嗯…那是团体聊天用的,是吗?注意…也许对于群聊,我会为每个房间设置AutoID,就像我为PrivateMessage MessageID所做的那样?我问了一个新问题,在那里会更清楚。无法删除此问题。。在@WilliamLoke,让这个新问题保持原样,这里你已经得到了答案,所以试试看。不要为同一个问题问新问题,这是不好的。试着用更多的信息和编码来编辑现有的问题,这对你、回答者和社区来说总是更好的。我已经删除了那个新问题,等一下。请阅读我的完整答案,而不仅仅是代码。它会帮助你的。