はじめに
Firebaseを使い始めました。
SDK導入時にCocoaPodsにいじめられた件(cocoapodsのinstallが途中で失敗してしまう(RPC failed; curl 18))などいろいろありましたが、私は元気です。
そして眠いです。
Firestoreから取得したドキュメントのデータはQueryDocumentSnapshot
で得られます。この中からdata()
を取り出すと、Dictionaryのようにデータを取り出すことができます。
よくわからない型(QueryDocumentSnapshot
)からデータをずるずるりと引きずり回すのはあまりスマートではないですよね。構造体を準備してそこに収めていくにしても、データを取り出して1つずつ入れていくとか、面倒この上ないです。
ラクしたい。そして眠いです。
本家Googleのドキュメントを見る
Cloud Firestoreでデータを取得する-カスタムオブジェクトを参照しました。
本家より賜ったサンプルコードは非常にあっさりしています。githubを見て各人勝手に理解せよ、という愛のある指導ですね。とりあえず、言いたいことはぼんやりと理解しました。
次はどうやって自分のプロジェクトに取り込むかですね。
自分のプロジェクトに取り込む流れを理解する
カスタムクラスを作る
なにはともあれ、カスタムクラスですね。サンプルコードを参考にどんな形にするか概観してみましょう
まず、ドキュメントで取り扱っているデータを保存するプロパティは必要ですね。サンプルコードではlet
が指定されていて、初期化時にデータを代入したら変えない仕様になっています。このあたりは、プロジェクト内でドキュメントのデータをどう取り扱うによりvar
のほうが良いかもしれません。
それと、初期化のためのメソッドですね。QueryDocumentSnapshot
からdata()
で取り出したDictionary型のデータのカタマリを渡してやると、カスタムクラス内のプロパティに適宜代入するものです。
結局フィールドに1つずつ入れていかないといけないのか、と若干がっかりしたのは内緒。JSONで取れればCodable
でうまく取りまわせたのにな…… もしかしたらJSONで取り出すことができるのかな……
Firestoreから取得したデータをバラバラにする
Firestoreから取得したデータをカスタムクラスで利用できるようにバラバラに切り刻んでいきます。
- Firestoreから取得したデータ(
QuerySnapshot
)からQueryDocumentSnapshot
の配列を取り出す QueryDocumentSnapshot
からDictionary
のデータのカタマリを取り出す
の2段構えです。
ここでflatMap
ですよ。
flatMap
については、mapとflatMapという便利メソッドを理解するで勉強しました。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Fadvent-calendar-ogp-background-7940cd1c8db80a7ec40711d90f43539e.jpg?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9bWFwJUUzJTgxJUE4ZmxhdE1hcCVFMyU4MSVBOCVFMyU4MSU4NCVFMyU4MSU4NiVFNCVCRSVCRiVFNSU4OCVBOSVFMyU4MyVBMSVFMyU4MiVCRCVFMyU4MyU4MyVFMyU4MyU4OSVFMyU4MiU5MiVFNyU5MCU4NiVFOCVBNyVBMyVFMyU4MSU5OSVFMyU4MiU4QiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzM0EzQzNDJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9OTcxYTUxOWVjNGM4NWY0NGQ1NTUyYWNhNTJjYTc0ZjA&mark-x=120&mark-y=96&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9OTcyJnR4dD0lNDBzaGltZXNhYmEmdHh0LWNvbG9yPSUyMzNBM0MzQyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWFhODcyODZlOTAwZWIwNTVkY2FmMDNhZTNjYTU2Y2Qx&blend-x=120&blend-y=500&blend-mode=normal&s=732e5e4a88e291325027a202330beb0d)
はっきり把握できてるか分かりませんが、つまるところ、良き感じに配列を解いていってくれるものと理解しました。これで先ほどの2段構えに立ち向かえば良いですね。
まぁfor ~ in ~
でヨイショヨイショと解いて行く方法もありますがね。今までよくわからないという理由で食わず嫌いをしてきたflatMap
を使ってみる良い機会ですので、試してみます。
いざ実践、の前に仕切り直し
本家ドキュメントに沿った形で進めていこうとしたのですが、なんとドキュメント1つを取得するパターンでした。これに対して、手元のコード(for ~ in ~
で解いていく方式)は複数のドキュメントを取得するパターンです。
これは一筋縄では行けない気配がします。仕切り直してから取り組んでみます。そして、理解に勘違いがあればその修正も。