質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

2017閲覧

firebaseから取得したチャットデータの未読を、既読に変換したい。

Yuya_Kimura

総合スコア11

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/12/19 05:47

編集2019/12/19 05:56

##達成したいこと
1対1のテキストチャット画面にて、メッセージ送信時に未読状態だった各メッセージを、メッセージ取得時に既読に変換したい。
より詳細には、最新99件の未読メッセージをFirebase Real Time DBから取得し、その取得したメッセージデータの既読情報のみ書き換えたいです。

##現状の実装

// DBへの参照を持つグローバル変数 let messageRef = Database.database().reference().child("Talks")

チャット送信部分のコード

Swift

1@IBAction func sendButtonPressed(_ sender: UIButton) { 2 3 let messagesDB = messageRef.child(userID!).child(chatMateInfo.uid).child("Messages") 4 // 一部省略 5 6 let timeInterval = NSDate().timeIntervalSince1970 7 let myTimeInterval = TimeInterval(timeInterval) 8 let time = NSDate(timeIntervalSince1970: TimeInterval(myTimeInterval)) 9 let formatter = DateFormatter() 10 formatter.dateFormat = "yyyy/MM/dd HH:mm:ss" 11 let currentTime = formatter.string(from: time as Date) 12 13 let messageDictionary = ["text": messageTextField.text!, 14 "senderUid": Auth.auth().currentUser?.uid, 15 "date": currentTime, 16 "isRead": "false"] 17 18 messagesDB.childByAutoId().setValue(messageDictionary) { 19 20 // 省略 21 } 22 let chatMateMessageDB = messageRef.child(chatMateInfo.uid).child(userID!).child("Messages") 23 chatMateMessageDB.childByAutoId().setValue(messageDictionary) { (error: Error?, dateRef: DatabaseReference) in 24 // 省略 25 } 26 }

メッセージ取得画面のコード

Swift

1func retrieveMessages () { 2 3 let messagesDB = messageRef.child(userID!).child(chatMateInfo.uid).child("Messages") 4 messagesDB.observe(.childAdded) { (snapshot) in 5 6 guard let snapshotValue = snapshot.value as? Dictionary<String, String> else { return } 7 8 let dateStr = snapshotValue["date"]! 9 let formatter: DateFormatter = DateFormatter() 10 formatter.locale = Locale(identifier: "ja_JP") 11 formatter.dateFormat = "yyyy/MM/dd HH:mm:ss" 12 let formattedDate = formatter.date(from: dateStr)! 13 14 let message = MessageBox(senderUid: snapshotValue["senderUid"]!, date: formattedDate) 15 if let text = snapshotValue["text"] { 16 message.text = text 17 } else { 18 message.imageURL = snapshotValue["imageURL"]! 19 } 20 self.messageBox.append(message) 21 self.messageTableView.reloadData() 22 23 // 一部省略 24 } 25 26     // このタイミングで未読を既読に変えたい。 27 messagesDB.queryOrdered(byChild: "isRead").queryLimited(toLast: 99).queryEqual(toValue: "false").observe(.value) { (snapshot) in 28 29 var talkContent = snapshot.value as? [String: Any] 30       // ここで値が書き換わっていない。keyはあくまでランダムなメッセージIDで、isReadはvalueの中の一部だから? 31 talkContent?.updateValue("true", forKey: "isRead") 32 } 33 }

##DBの構造

やったこと、現状悩んでいること

以下のコードで最新99件の未読データメッセージを取得し、未読/既読のkey=isReadのみ値を書き換えたい(falseからtrueへ)と思っており
updateValueを用いたのですが、値が書き変わりません。おそらくkeyはあくませメッセージのIDで、isReadはdateやtextなどと同じようにvalueに一部なので以下のような書き方では値を書き換えることができないんだと思うのですが
valueの中のisReadのみにアクセスし値を書き換えるやり方がわからず苦戦しています。
情報量が多くて恐縮ですが、ご教授いただけますと幸いです。

messagesDB.queryOrdered(byChild: "isRead").queryLimited(toLast: 99).queryEqual(toValue: "false").observe(.value) { (snapshot) in var talkContent = snapshot.value as? [String: Any]        // ここで値が書き換わっていない。keyはあくまでランダムなメッセージIDで、isReadはvalueの中の一部だから? talkContent?.updateValue("true", forKey: "isRead") }

##その他の情報
開発環境:
Xcode 10.1
Swift 4.2.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問