2017-05-14 9 views
0
var chatMessages = [[String: ChatMessage]]() 

Firebase 채팅 메시지 구조는 이와 유사합니다.배열 업데이트 [String : [Dictionary]] Firebase에서 valueChanged 일 때

-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 -이 ChatMessage

에 저장되어있는 문자열과 값 이하로 저장되어있는 threadID입니다 그러나 사용자가 메시지를 읽은 후에 값이 변경되고 그 값은 childChanged으로 식별됩니다. 따라서 childChanged 변경에서 배열을 올바르게 업데이트하는 방법은 무엇입니까?

답변

1

childChanged 이벤트에서 (이 경우) 키가 Kjws99ol6qjFt7ET9C이고 값이 자식 노드 데이터 인 업데이트 된 하위의 스냅 샷이 응용 프로그램에 전달됩니다.

배열을 업데이트하려면 해당 키에 해당하는 chatMessages 배열의 색인을 찾아 그에 따라 값을 업데이트하십시오.

가의 배열입니다 당신이 설정 한 배열에서 찾을하려면 다음 사전은 인덱스가 있으면, 당신은 다음의 요소를 업데이트 할 수 있습니다

let searchKey = "Kjws99ol6qjFt7ET9C" 
let index = chatMessages.map({$0.keys.first!}).index(of: searchKey) 

다음을 수행 [문자열 ChatMessage] 새로운 데이터를 가지는 배열 당신이 추가 코드가 필요한 경우

{$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 

알려 수 있습니다.

그러나, 나는 강력하게 배열

class ChatMessage { 
    var fbKey = ""  // the key like Kjws99ol6qjFt7ET9C 
    var content = "" // like "Hehd" 
    var displayName "" // "John Doe" 
} 

var chatMessages = [ChatMessage]() 

그것을 유지하기 쉬울 것입니다 및 배열 검색이 간단하고 빠른에 ChatMessage 클래스 (또는 구조체)를 저장하기 위해 모델을 변경 격려한다. 이 사용 사례와

는 특정 인덱스이

let searchKey = "Kjws99ol6qjFt7ET9C" 
let index = chatMessages.index(where: { $0.fbKey == searchKey}) 
+0

클래스 ChatMessage() { fbKey = ""// Kjws99ol6qjFt7ET9C 내용처럼 키 = ""// "Hehd" 나 displayName ""// "홍길동" 같은} 그러나 ChatMessage에서 키를 가짐으로써() 방법 나는 그것을 변화에 직접 확인하겠습니까? – Nitesh

+0

사전 대신 클래스를 사용하여 권장 솔루션을 사용하여 메시지를 찾을 수있는 코드로 답변을 업데이트했습니다. – Jay

+0

감사합니다. 너의 생각이있어. – Nitesh

0

사전을 배열에 저장하는 이유에 대해 혼란 스럽습니다. 그것은 당신이 열쇠로이 푸시 ID를 저장하여 유효한 사전을 가질 수 있도록 데이터베이스에서 고유 것이다 각 메시지 푸시 ID (예를 들어, -Kjws99ol6qjFt7ET9C)와 같은 모델을 충족시킬

var chatMessages = [String: ChatMessage]() 

처럼 나에게 보인다.

childChanged 이벤트를 받으면 사전에서 snapshot.key을 찾아서 업데이트하여 변경된 메시지를 빠르게 찾을 수 있습니다.

+0

var에 chatMessages = 할 찾을 [문자열 : ChatMessage]() 나에게 여러 메시지를 보관하지 않습니다. 데이터 추가를 의미합니다. – Nitesh

+0

'chatMessages [ "newId"] = ChatMessage()'는 어떨까요? –

+0

indexPath가 필요합니다. like chatMessages [0] [ "newId"] – Nitesh