Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Firebase中更改值时更新数组[[String:[字典]]]_Ios_Swift_Firebase_Firebase Realtime Database_Nsarray - Fatal编程技术网

Ios 在Firebase中更改值时更新数组[[String:[字典]]]

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

Firebase聊天信息结构如下所示

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} )