ファイアベースストアからデータを取得する時に、データベース側で新しいドキュメントが追加されたことを監視
して、更に新規追加されたドキュメントのみ取得すると言うことができる。
それが
addSnapshotListener関数
まずは、普通のドキュメントの取得方法
Firestore.firestore().collection("user").getdocuments{(res, err) in
if let err = err {
//エラー時の処理
return
}
//データの取得に成功したとき
}
})
これでuserドキュメントのデータを全件配列としてコールバック関数の引数であるresとして受け取れる。
では、更新されたデータのみを取得する場合の書き方を見てみる。
private func fetchChatroomsInfoFromFirestore() {
Firestore.firestore().collection("user").①addSnapshotListener{(snapshots, err) in
// .getDocuments { (snapshots, err) in
if let err = err {
return
}
②snapshots?.documentChanges.forEach({(documentChange) in
switch documentChange.type{
case .added:
self.handleAddedDocumentChange(documentChange: documentChange)
case .modified,.removed:
print("nothing to do")
}
})
}
まずは、①のaddSnapshotListener
この関数は、初回のデータ取得時にコレクションに対してリスナーを設置する&&通常のデータ取得と考えると分かりやすい。かなり特殊な動きをする。
例えば、fetchChatroomsInfoFromFirestore関数が、画面生成時に呼ばれるViewDidlosd関数のなかで呼ばれると、userドキュメントののデータを全件取得して更にドキュメントに対してリスナーを設置する。
このリスナーはドキュメントの更新を監視するもので新規ドキュメント追加時にオートでaddSnapshotLisner以下の処理が実行されるようになる。
②は取得したuserコレクションのドキュメント情報全件(配列)のsnapshotに対して前回の取得時のデータに対して何らかの変化があったドキュメントに対して foreachをかける。(documentChanges)
ドキュメントのタイプが新しく更新されたものと言う条件式をつけて処理を書くことで
新しいデータのみ取得される。
初回取得時と二回目の取得時の処理の流れ
上の説明を聞くと、初回のデータ取得時はもともと入っていたデータだから取得されないんじゃないのと思うかもしれないが、ここが特殊な動きで
最初にデータを取得する時は、全件のデータを取得して、その後の更新時は前回取得したデータに対して最新のデータを照合してその差分を抽出するような動きになる。
また、データのタイプ型にはremovedや、modifiedなどがあり、
removed: 差分データで消されたドキュメント
removed: 差分データで更新されたドキュメント
とデータがどのように変化したかで対象ドキュメントを絞る事ができる