teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

回答追記

2019/07/27 23:18

投稿

razuma
razuma

スコア1313

answer CHANGED
@@ -4,4 +4,44 @@
4
4
 
5
5
  変数名を見たところだと_listenedが未読、既読を管理しているものでしょうか?
6
6
  だとすればそれを各ユーザごとにカウントしたら良いような気もしますが。
7
- (構造を自分で考えたのであればわかりそうな気もするのでそう言う問題ではない?)
7
+ (構造を自分で考えたのであればわかりそうな気もするのでそう言う問題ではない?)
8
+
9
+ ===2019/07/28 追記===
10
+ 現在の作りでいくと一覧表示をさせるためにself.newsには送信ユーザごとの最新メッセージしか入っていないと思うのでfilterではカウントできないと思われます。
11
+ 全メッセージが入っている配列に対してであれば、filterで複数条件を指定すれば良いので以下のようにすれば未読カウントがとれるかと思います。
12
+ ```
13
+ var allMessages = [New]() // その人の全メッセージが入っている配列と仮定する
14
+
15
+ // 未読かつ送信IDが同じ(その人の全メッセージではなくて、本当に全メッセージが入ってしまうのであればtoIDが自分宛の条件を追加)
16
+ var test1: Int = allMessages.filter {$0.listened == false && $0.sender_id == user.sender_id}.count
17
+ ```
18
+ または表示データを作成するgetNewTalk内で未読カウントなども考えられるかと思います。
19
+ Newクラスはメッセージ内容を保持するクラスだと思うので、メッセージ一覧の内容を保持するような新たなクラスを作ってgetNewTalk内で値を入れていく方がもしかしたら良いかもしれません。
20
+ (現在表示させてる内容だけであれば、名前、最終時間、未読数があれば良い?)
21
+ とりあえず、IDごとに未読数を保持するようなものを作って書いた場合
22
+ ```
23
+ var unreadCount = [String:New]()
24
+ // 送る主が自分以外で、かつ、送り先が自分であるとき
25
+ // ここの中で未読数をカウントしていく
26
+ else if toID == Auth.auth().currentUser?.uid {
27
+ self.chatPartnerId = toID!
28
+ ~ 省略
29
+ // 未読がfalseのときにカウントしていく
30
+ if !listened {
31
+ if let count = unreadCount[self.chatPartnerId] {
32
+ unreadCount[self.chatPartnerId] = count + 1
33
+ } else {
34
+ unreadCount[self.chatPartnerId] = 1
35
+ }
36
+ }
37
+ }
38
+ // 上記でunreadCountにIDごとの未読数がカウントされてると思うので正しいかをログなどで確認してみる
39
+ ~ 省略
40
+ // 以下cellForItemAt内
41
+ let user = news[indexPath.row]
42
+ var test1 = unreadCount[user.sender_id] // これで未読数が取れるはず
43
+
44
+ ```
45
+ 実装するための考え方はこんな感じかと思います。
46
+ そもそものデータの持ち方をどうするか、APIがあるのであればそちら側に寄せるなどの考え方もあるかと思います。
47
+ 長くなってしまったところと分かりにくい部分などもあるかもしれませんので何かあればコメントをお願いいたします。