gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 14:47:21 25 4
gpt4 key购买 nike

我正在尝试在聊天信使的主屏幕上显示我上次发送的消息,从 Storyboard来看它看起来像: enter image description here

我使用的代码是:

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 看起来像

enter image description here

现在我的 firebase 看起来像: enter image description here

我使用发送和接收 ID 创建了一个 chatRoomId。但是,我现在无法显示本应显示在主屏幕上的上次发送的消息。我有什么办法可以解决这个问题吗?还是我获取数据库的方式不对?

最佳答案

根据您的数据库结构,您的查询是错误的。也不要在其他查询 block 内执行 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)
}
}

这将获取由 fromId 为请求的 chatRoomId 发送的最后一条消息。有关更多详细信息,请查看 Firebase Queries文档。

如果您想在表中为所有用户执行此操作,例如在 WhatsApp 或其他聊天应用程序中,那么您将需要创建一个额外的表 LastMessages 并保存最后一条消息这里的信息与每个 chatRoomId 相对应,或者如果可能的话,将此详细信息保存在可以使用 tableData 获取的地方,这样您就不需要查询每个 chatRoom在一个循环中。

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

编辑:评论获取最后一条消息,无论我发送给收件人还是收件人发送给我

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

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

关于ios - Swift 使用 firebase 在聊天中显示最后发送的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50149454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com