Firebaseから取得したドキュメントをカスタムクラスに入れていく

はじめに

Firebaseを使い始めました。
SDK導入時にCocoaPodsにいじめられた件(cocoapodsのinstallが途中で失敗してしまう(RPC failed; curl 18))などいろいろありましたが、私は元気です。
そして眠いです。

401 Unauthorized

Firestoreから取得したドキュメントのデータはQueryDocumentSnapshotで得られます。この中からdata()を取り出すと、Dictionaryのようにデータを取り出すことができます。

よくわからない型(QueryDocumentSnapshot)からデータをずるずるりと引きずり回すのはあまりスマートではないですよね。構造体を準備してそこに収めていくにしても、データを取り出して1つずつ入れていくとか、面倒この上ないです。

ラクしたい。そして眠いです。

本家Googleのドキュメントを見る

Cloud Firestoreでデータを取得する-カスタムオブジェクトを参照しました。

Cloud Firestore でデータを取得する  |  Firebase

本家より賜ったサンプルコードは非常にあっさりしています。githubを見て各人勝手に理解せよ、という愛のある指導ですね。とりあえず、言いたいことはぼんやりと理解しました。

次はどうやって自分のプロジェクトに取り込むかですね。

自分のプロジェクトに取り込む流れを理解する

カスタムクラスを作る

なにはともあれ、カスタムクラスですね。サンプルコードを参考にどんな形にするか概観してみましょう

まず、ドキュメントで取り扱っているデータを保存するプロパティは必要ですね。サンプルコードではletが指定されていて、初期化時にデータを代入したら変えない仕様になっています。このあたりは、プロジェクト内でドキュメントのデータをどう取り扱うによりvarのほうが良いかもしれません。

それと、初期化のためのメソッドですね。QueryDocumentSnapshotからdata()で取り出したDictionary型のデータのカタマリを渡してやると、カスタムクラス内のプロパティに適宜代入するものです。

結局フィールドに1つずつ入れていかないといけないのか、と若干がっかりしたのは内緒。JSONで取れればCodableでうまく取りまわせたのにな…… もしかしたらJSONで取り出すことができるのかな……

Firestoreから取得したデータをバラバラにする

Firestoreから取得したデータをカスタムクラスで利用できるようにバラバラに切り刻んでいきます。

  • Firestoreから取得したデータ(QuerySnapshot)からQueryDocumentSnapshotの配列を取り出す
  • QueryDocumentSnapshotからDictionaryのデータのカタマリを取り出す

の2段構えです。

ここでflatMapですよ。

flatMapについては、mapとflatMapという便利メソッドを理解するで勉強しました。

mapとflatMapという便利メソッドを理解する - Qiita
最近になってmapやflatMapの勉強をしたのでその辺りを書いてみます。mapやflatMapなんですが配列にもOptionalにもあるしObjective-cにはないメソッドなので最初見た時は…

はっきり把握できてるか分かりませんが、つまるところ、良き感じに配列を解いていってくれるものと理解しました。これで先ほどの2段構えに立ち向かえば良いですね。

まぁfor ~ in ~でヨイショヨイショと解いて行く方法もありますがね。今までよくわからないという理由で食わず嫌いをしてきたflatMapを使ってみる良い機会ですので、試してみます。

いざ実践、の前に仕切り直し

本家ドキュメントに沿った形で進めていこうとしたのですが、なんとドキュメント1つを取得するパターンでした。これに対して、手元のコード(for ~ in ~で解いていく方式)は複数のドキュメントを取得するパターンです。

これは一筋縄では行けない気配がします。仕切り直してから取り組んでみます。そして、理解に勘違いがあればその修正も。