Cloud Firestore の endAtDocument がややこし過ぎた
チャットなんかで毎回データを全て取得するのはよく無さそうだけど
どうしたら良いのか分からない...。
ってお悩みのあなたへ!
こちらの動画をご覧くださいmm
チャット
例えば、チャットで最新のデータを20個取得したとします。
ただ、チャットであればリアルタイム更新がしたいですよね。
ということで、snapshotsを使用します。
ここで注意。
snapshots はどのデータを監視するべきでしょうか?
(...)
答えは、場合による。です。
wwwww
まぁ、そらそうなんだけど、
一般的な話をしてくれって事だと思うので、
一般的なことを伝えると
・新しく作成されたデータ
・更新されたデータ
のはずよね。
例えば、緑色のSNSとかだと
チャットを送信したり送信されたら
勝手にメッセージが届くよね。
あれは、新しく作成されたデータのはず
また、24時間以内のデータなら
「送信取消」ってのがあるよね。
これは多分、更新されたデータのはず。
これら2つを snapshots で監視をして
UIに反映させられたらこちらの勝ちって事だと思う。
ということで、それらをどうするべきか考えよう。
先に結論コレが正解↓
db
.collection('chats')
.orderBy('createdAt', descending: true)
.endAtDocument(lastDoc!)
.snapshots().listen((value){
// 監視後の処理
})
descending が true って事は降順よね。
例を挙げると、こんな感じで最新順になるって事。
例)
12/30
12/29
12/28
で endAtDocument 処理が何をするのか?
ですよね。
例えば、上記の例で言うと
12/30 のドキュメントを基準に監視したとします。
12/31 のドキュメントが作成
→ 検知します。
12/27 のドキュメントが作成
→ 反応無し
なので、descending == true の時は endAtDocument が良さそうです。
descending が false の場合は??
この場合はまず取得するデータの順番はこうなります
例)
12/28
12/29
12/30
(...)
さっきと逆ですね。
では、この状態でさっきと同じように
12/30 を基準として endAtDocument を使って snapshots を発火させるとどうなるのか?
12/31 のドキュメントを追加
→ 反応無し
12/27 のドキュメントを追加
→ 検知します。
と言うことで、さっきと真逆の反応のようです。
謎ですね・・・。
普通によく分からん。でもこう言うもんだろと思って無理やり暗記します。
descending == false の場合でも・・・
最新のデータを検知したいですよね。
と言うことで、ちょっとだけ探ってみると、
startAtDocument ってのが見当たりました。
何となく対照的だし上手く行けそうな気がする・・・
descending == false の場合だから取得するデータの順番は下記の通り。
例)
12/28
12/29
12/30
では、実際に
12/30 を基準として startAtDocument と snapshots を使って監視すると、、、
12/31 のドキュメントを追加
→ 検知します。
12/27 のドキュメントを追加
→ 反応無し
どうやら上手く行ったようですね。
まとめ
descending == true / false に応じて
startAtDocument , endAtDocument を使い分ける必要性がありそう。
Discussion