Ios 在Firebase中更改值时更新数组[[String:[字典]]]
Firebase聊天信息结构如下所示Ios 在Firebase中更改值时更新数组[[String:[字典]]],ios,swift,firebase,firebase-realtime-database,nsarray,Ios,Swift,Firebase,Firebase Realtime Database,Nsarray,Firebase聊天信息结构如下所示 var chatMessages = [[String: ChatMessage]]() 现在在childAdded上,我像这样附加新消息 -Kjws99ol6qjFt7ET9C content: "Hehd" displayName: "John Doe" fileLength: 0 fileUrl: "" fromID: "5904ee8cfa" isRead: false mess
var chatMessages = [[String: ChatMessage]]()
现在在childAdded上,我像这样附加新消息
-Kjws99ol6qjFt7ET9C
content: "Hehd"
displayName: "John Doe"
fileLength: 0
fileUrl: ""
fromID: "5904ee8cfa"
isRead: false
messageStatus: 2
messageType: "normal"
timestamp: 1494596232
//Kjws99ol6qjFt7ET9C-这是存储在字符串中的threadID,下面的值存储在ChatMessage中
但是,在用户读取消息后,它的值发生了变化,并且由childChanged标识。因此,在childChanged中,如何正确更新我的数组?我不明白为什么要将字典存储在数组中。在我看来是
weakSelf.chatMessages.append(newMessage)
将满足您的模型,因为每个消息推送id(例如-Kjws99ol6qjFt7ET9C)在数据库中是唯一的,因此您可以通过将此推送id存储为密钥来拥有有效的字典
当您收到childChanged事件时,您可以通过查找字典中的snapshot.key并对其进行更新,快速找到已更改的消息 在childChanged事件中,向应用程序传递更新的子节点的快照,在本例中,键为Kjws99ol6qjFt7ET9C,值为子节点数据 要更新数组,请查找chatMessages数组中与该键对应的索引,并相应地更新该值 要在已设置的数组(即[String:ChatMessage]字典数组)中找到它,请执行以下操作
var 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类或结构
chatMessage[index] = updated data
它将更易于维护,并且阵列搜索将简化且更快
在本用例中,要查找特定索引,请执行以下操作
class ChatMessage {
var fbKey = "" // the key like Kjws99ol6qjFt7ET9C
var content = "" // like "Hehd"
var displayName "" // "John Doe"
}
var chatMessages = [ChatMessage]()
var chatMessages=[String:ChatMessage]不允许我存储多条消息。我的意思是附加数据。那么chatMessages[newId]=ChatMessage呢?它需要indexPath。与chatMessages[0][newId]类似,如果您计划将chatMessages映射到TableViewCells或类似对象,则可以按chatMessages.keys排序,然后解析到数组中。是的,我尝试仅使用theadID创建数组,但这也不起作用,因为我需要indexPAth来指定应在何处更新itclass ChatMessage{fbKey=//像Kjws99ol6qjFt7ET9C这样的键content=//像Hehd displayName//John Doe}但是通过在ChatMessage中设置键,我将如何在更改时直接识别它?用代码更新答案,以使用我推荐的类解决方案而不是字典来查找消息。谢谢。了解您的想法。
let searchKey = "Kjws99ol6qjFt7ET9C"
let index = chatMessages.index(where: { $0.fbKey == searchKey} )