twitter上の@iphone_dev_jpで教えてもらったので、せっかくなのでまとめて公開しておきます。

■問題点(質問したこと)

次のようなCoreDataのデータモデルがあったとします。

EntityのオブジェクトentityにはsubEntityが1000個関連付けられていたとします。

Entity *entity;

そうすると、SubEntityを取得したいときに一度に1000個SubEntityのオブジェクトが作られることになり、これは実行時間の観点からもメモリの観点からもあまりよろしくありません。

eitity.sub //遅い&メモリ使い過ぎ

なので、(今回はTableViewに表示することが目的でもあったので)NSFetchResultsControllerでこれを表示するのがベストです。が、relationをもとにNSFetchRequestを作る方法がわからない

というのが自分が質問したことでした。

■解決案

NSPredicateでの設定でrelationshipをそのまま書けばOK

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self IN %@",entity.sub];
[fetchRequest setPredicate:predicate];

この方法を教えてもらったのですが、これの何がすごいかというと

  • NSPredicateではentity.subと書いてもその時点で1000個のデータがロードされる事は無い
    他のところだとロードして長い時間待つことになります
  • SQLを見ると、main=○○といった形に最適化されていた
    特定条件下では最適化しているようです
  • selfが使える
    自分の勉強不足ですが、selfの指定が出来ることを知りませんでした

というところです。
これをしって正直NSPredicateをなめていたなと思いました。
CoreDataに関してはまだまだ知らない便利機能とかありそうなので、どんどん調べていきたいな〜と思っています。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>