var chatMessages = [[String: ChatMessage]]()
Firebase聊天消息结构是这样的。
-Kjws99ol6qjFt7ET9C
content: "Hehd"
displayName: "John Doe"
fileLength: 0
fileUrl: ""
fromID: "5904ee8cfa"
isRead: false
messageStatus: 2
messageType: "normal"
timestamp: 1494596232
现在childAdded
我正在添加这样的新消息
weakSelf.chatMessages.append(newMessage)
// Kjws99ol6qjFt7ET9C - 这是存储在String中的threadID,下面的值存储在ChatMessage
但是在消息isRead by user之后,它的值会发生变化并由childChanged
标识,所以在childChanged中更改了如何正确更新我的数组?
答案 0 :(得分:1)
在childChanged事件中,应用程序将传递更新子项的快照,其中(在本例中)键为Kjws99ol6qjFt7ET9C,值为子节点数据。
要更新数组,请找到chatMessages数组中哪个索引与该键对应,并相应地更新该值。
要在您设置的数组中找到它,这是[String:ChatMessage]字典的数组,请执行以下操作
let searchKey = "Kjws99ol6qjFt7ET9C"
let index = chatMessages.map( {$0.keys.first!} ).index(of: searchKey)
获得索引后,可以使用新数据更新数组中的元素。
{$0.keys.first!} - compiles all of the keys in the chatMessage array into an array
index(of: searchKey) - finds the index of the searchKey we are looking for
然后你可以
chatMessage[index] = updated data
如果您需要任何其他代码,请与我们联系。
但是,我强烈建议更改模型以在数组中存储ChatMessage类(或结构)
class ChatMessage {
var fbKey = "" // the key like Kjws99ol6qjFt7ET9C
var content = "" // like "Hehd"
var displayName "" // "John Doe"
}
var chatMessages = [ChatMessage]()
它将更容易维护,阵列搜索更简单,更快。
使用此用例,要查找特定索引,请执行此操作
let searchKey = "Kjws99ol6qjFt7ET9C"
let index = chatMessages.index(where: { $0.fbKey == searchKey} )
答案 1 :(得分:0)
我很困惑为什么要将字典存储在数组中。它看起来像我
root
会满足您的模型,因为每个消息推送ID(例如var chatMessages = [String: ChatMessage]()
)在数据库中都是唯一的,因此您可以通过将此推送ID存储为密钥来拥有有效的字典。
当您收到-Kjws99ol6qjFt7ET9C
事件时,您可以通过在字典中查找childChanged
并更新它来快速找到已更改的邮件。