会話ノードがあり、内部にはdisplayMessage、conversationName、imageUrlなどの単純なサブノードがありますが、senderID、テキスト、タイムスタンプなどのデータを使用して会話内で送信されるすべてのメッセージを説明する追加のサブノードを保持するメッセージノードもあります。メッセージの送信ボタンが押されたときに、メッセージノードを追加のメッセージサブノードと、displayMessageやlastMessageTimeなどの単純なサブノードで更新しようとしています。ただし、私が持っているコードは、「メッセージ」内のすべてのノードを新しいメッセージノードだけに完全に置き換えます。
fileprivate func sendMessage(uid: String, convoId: String) {
let ref = Database.database().reference().child("conversations").child(convoId)
let messageTime = NSDate().timeIntervalSince1970
let messageInfo : [String:Any] = ["text":containerView.chatTextView.text, "senderId":uid, "timestamp": messageTime]
let randomMessageId = NSUUID().uuidString
let messageDict = [randomMessageId:messageInfo]
let values = ["displayMessage":containerView.chatTextView.text, "lastMessageTime": messageTime, "messages":messageDict] as [String : Any]
ref.updateChildValues(values) { (error, ref) in
if error != nil {
print (error as Any)
return
}
self.containerView.clearChatTextField()
}
}
を使用するupdateChildValues
と、Firebaseサーバーはディクショナリ内の各キーをループsetValue
し、指定した値で各キーを呼び出します。
これは、辞書の最上位でのみマージされることを意味します。各子で、既存の値を置き換えます。
JSONの下位レベルで更新/追加を実行する場合は、それらの子へのパスを辞書のキーにエンコードする必要があります。したがってmessages
、会話の子に新しいメッセージを追加するには、新しいメッセージのパスをキーとして持つ必要があります。すでに独自のメッセージIDを生成しているので、必要なものはすべて、辞書の値ではなくキーに含めます。
let randomMessageId = NSUUID().uuidString
let values = ["displayMessage": containerView.chatTextView.text,
"lastMessageTime": messageTime,
"messages/"+randomMessageId: messageInfo] as [String: Any]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加