NSFetchRequestで特定のRelationshipを指定する方法

twitter上の@iphone_dev_jpで教えてもらったので、せっかくなのでまとめて公開しておきます。 ■問題点(質問したこと) 次のようなCoreDataのデータモデルがあったとします。 EntityのオブジェクトentityにはsubEntityが1000個関連付けられていたとします。

1
Entity *entity;

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

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

なので、(今回はTableViewに表示することが目的でもあったので)NSFetchResultsControllerでこれを表示するのがベストです。が、relationをもとにNSFetchRequestを作る方法がわからない というのが自分が質問したことでした。
■解決案 NSPredicateでの設定でrelationshipをそのまま書けばOK

1
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に関してはまだまだ知らない便利機能とかありそうなので、どんどん調べていきたいな〜と思っています。