【Swift】Core Dataの使い方。Fetched Propertyを使ってプロパティにフェッチ結果を持たせる。(Swift 2.1、XCode 7.2)

2020年6月16日

Fetched Propertyとは

本記事ではCore Dataの機能のFetched Property(フェッチドプロパティ)について説明する。

フェッチドプロパティとは、フェッチ結果のオブジェクトを保持するプロパティである。

モデルを定義するときのRelationshipの下に表示されている「Fetched Properties」(下図赤枠)でこの機能を実装する。

Fetched Propertyを設定する箇所

 

例えば、作家と作家の出版物を管理する場合で考えよう。

下図のように作家オブジェクトに名前、性別、年齢、出版物のプロパティを持たせる。外部ファイルに多くの著者の書籍データがあり、その中から杉田真の書籍データをフェッチして出版物プロパティに配列で持たせる。これがフェッチドプロパティである。

フェッチドプロパティの例

フェッチドプロパティを試す

実際にフェッチドプロパティを試してみよう。

以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる人はご利用されたし。
⇒「テスト用プロジェクト

事前準備では、著者情報を表示する画面と、書籍データを追加削除する画面を作っておいた。「出版物読み込み」ボタンを押したらフェッチドプロパティを利用して書籍一覧が表示されるものをこれから実装する。

 

以下はViewController.swiftの変更前のソースコード。アプリ起動直後に著者の名前、性別、年齢を画面に表示している。

 

まずはモデルにフェッチドプロパティを定義しよう。

下図赤枠の「プロジェクト名.xcdatamodeld」を選択、黄緑枠のAuthorエンティティを選択する。紫枠の「+」ボタンを押してフェッチドプロパティの行を追加する。

黄枠のデータモデルインスペクタボタンを押して設定画面を表示し、Nameに「publication」、Destinationに「Book」、Predicateに「author == $FETCH_SOURCE.name」を入力する。

これは「Bookエンティティのオブジェクトたちの中から、著者名と名前が一致するものをフェッチする」という条件設定である。

フェッチドプロパティを作る

 

ViewController.swiftの「出版物読込ボタン押下時の呼び出しメソッド」を以下のコードに変更する。

出版物(フェッチドプロパティ)からフェッチ結果の配列を取り出し、テキストビューに一覧表示している。

 

以下が実際のプレイ動画。「出版物読み込み」ボタンを押す度に、保存されているデータの中から杉田真の書籍のみが検索されていることが分かる。

 

NSArray型で取得した場合

1つ興味深い仕様がある。「出版物読込ボタン押下時の呼び出しメソッド」を以下のコードに変更して実行してみてほしい。

出版物の配列を取得するときにNSArray型にキャストして取得するようにした。

 

以下は実際のプレイ動画。「出版物読込み」ボタンを押すと、保存されているデータの中から杉田真の書籍のみが検索されるのは先ほどと同じだが、それ以降はボタンを押しても1回目と同じデータしか取得できない。

 

これは、フェッチプロパティをNSArray型で取得すると、オブジェクト内部でNSArray型のフェッチ結果が保持される仕様のためである。

ただし、以下のコードでオブジェクトをリフレッシュすれば毎回最新の検索結果を取得できる。

 

また、著者オブジェクトがどこからも参照されなくなってメモリから解放されたとき、フェッチ結果もクリアされる。なので、フェッチドプロパティを未来のデータ変更の影響を受けない、その時点のフェッチ結果を保持するプロパティとして使うことはできない。