在Firebase中的valueChanged时更新数组[[String:[Dictionary]]]

时间:2017-05-14 09:27:13

标签: ios swift firebase firebase-realtime-database nsarray

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中更改了如何正确更新我的数组?

2 个答案:

答案 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并更新它来快速找到已更改的邮件。