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

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

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

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

Swift

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

Q&A

解決済

1回答

2456閲覧

Firestoreから取得したデータの順番を時系列にしたい

Hyperbolic4183

総合スコア17

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/06/24 01:46

編集2020/06/24 01:55

##現在の状態
Firestoreでチャットアプリを制作しており、テキストフィールドに入力したパスワードとFirebasedatabeseにあるドキュメントと一致した時のみ画面遷移をするようにしている。
メッセージをやり取りするビューではSnapshotListnerでメッセージ情報を監視しているため、そのビューに遷移するとドキュメントに存在していたメッセージドキュメントの情報を遷移先のビューに表示される。

イメージ説明

##困っていること
画面遷移後は、送信したものがどちらの画面にもリアルタイムで反映されるため問題はないが、メッセージがたまった状態で遷移をすると時系列がずれてしまう。

##試したこと

メッセージ情報に含まれているTimeStampをDate型に変換し、

self.messages = self.messages.sorted(by: { (m1,m2) in return m1.sentDate < m2.sentDate

のようにソートしているが、反映されない。Snapshotはクロージャであるので、表記の位置をいろいろ試したが、うまくいかなかった。
画面遷移の際にprint("message.sentDate(message.sentDate)")は行われているが、時系列順になっていない。

func fetchMessage() { postRef.document(password).collection("messages").addSnapshotListener{ (snapshots, err) in if let err = err { print("メッセージ情報の取得に失敗しました。(err)") return } snapshots?.documentChanges.forEach( { (DocumentChange) in switch DocumentChange.type { case .added: let dic = DocumentChange.document.data() let dicMessage = StoredMessage(dic: dic) //メッセージのドキュメントを取得し、格納 //userIdが一致しない時senderをOtherUserにする self.messageArrayForDelete.append(DocumentChange.document.documentID) let sendertest = self.user(senderId: dicMessage.sender) //Timestamp型をDate型に変換 let dateValue = dicMessage.time.dateValue() let message = Message(sender: sendertest, messageId: self.randomString(length: 20), sentDate: dateValue, kind: .text(dicMessage.message)) print("message.sentDate(message.sentDate)") self.messages.append(message) self.messagesCollectionView.insertSections([self.messages.count - 1]) case .modified, .removed: print("nothing to do") } } ) } self.messages = self.messages.sorted(by: { (m1,m2) in return m1.sentDate < m2.sentDate }) }

よろしくお願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー

self.collectionView.reloadData()を実行してみてください。

func fetchMessage() { postRef.document(password).collection("messages").addSnapshotListener{ (snapshots, err) in if let err = err { print("メッセージ情報の取得に失敗しました。(err)") return } snapshots?.documentChanges.forEach( { (DocumentChange) in switch DocumentChange.type { case .added: let dic = DocumentChange.document.data() let dicMessage = StoredMessage(dic: dic) //メッセージのドキュメントを取得し、格納 //userIdが一致しない時senderをOtherUserにする self.messageArrayForDelete.append(DocumentChange.document.documentID) let sendertest = self.user(senderId: dicMessage.sender) //Timestamp型をDate型に変換 let dateValue = dicMessage.time.dateValue() let message = Message(sender: sendertest, messageId: self.randomString(length: 20), sentDate: dateValue, kind: .text(dicMessage.message)) print("message.sentDate(message.sentDate)") self.messages.append(message) self.messagesCollectionView.insertSections([self.messages.count - 1]) self.messages = self.messages.sorted(by: { (m1,m2) in return m1.sentDate < m2.sentDate }) //reloadData()を実行 self.messagesCollectionView.reloadData() case .modified, .removed: print("nothing to do") } } ) } }

投稿2020/06/24 02:14

akaakoz

総合スコア183

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

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

Hyperbolic4183

2020/06/24 02:31

回答ありがとうございます! 実行したところ Invalid update: invalid number of sections. The number of sections contained in the collection view after the update (2) must be equal to the number of sections contained in the collection view before the update (2), plus or minus the number of sections inserted or deleted (1 inserted, 0 deleted). というエラーが出ました。 コレクションセルの数が合わないということでしょうか?
akaakoz

2020/06/24 02:46

sectionsの数を更新(update)する際にエラーが起きてるようです。 self.messagesCollectionView.insertSections([self.messages.count - 1]) ↑のラインをコメントアウトして実行するとどうなりますか?
Hyperbolic4183

2020/06/24 02:57

時系列順に表示されるようになりました! ありがとうございます!!! 本当に助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問