##現在の状態
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 }) }
よろしくお願いします
回答1件
あなたの回答
tips
プレビュー