約executeFetchRequest:
MOC に送信されたメッセージ
はい
管理対象オブジェクトの配列を返す
はい。ただし、取得する結果のタイプを変更することもできます。ではNSFetchRequest
、次の方法で別の結果タイプを設定できます。
- (void)setResultType:(NSFetchRequestResultType)type
どこNSFetchRequestResultType
でさまざまなタイプにすることができます。アップルのドキュメントから引用:
enum {
NSManagedObjectResultType = 0x00,
NSManagedObjectIDResultType = 0x01,
NSDictionaryResultType = 0x02
NSCountResultType = 0x04
};
typedef NSUInteger NSFetchRequestResultType;
目標: 永続ストアから MOC にオブジェクトをフェッチする
はい、NSFetchRequest
リクエストを作成して実行することは、SQL で SELECT ステートメントを作成することと同じです。も使用する場合は、NSPredicate
SELECT-WHERE ステートメントを使用するのと同じです。
テーブル ビューあり: テーブル ビューとは関係ありません
はい。ただし、取得したデータをテーブルに入力できます
頻度: ループで使用されることが多いため、何度も呼び出すことができます
それは、あなたが何を達成したいかによって異なります。ループ内にあるかどうかは関係ありません。ループ内でリクエストを実行すると、パフォーマンスに影響を与える可能性がありますが、心配する必要はありません。内部では、Core Data は一種のキャッシュ メカニズムを維持しています。要求を実行するたびに、データがキャッシュにない場合、Core Data はストア (SQL ファイルなど) でラウンドトリップを実行し、取得したオブジェクトをキャッシュに取り込みます。同じクエリを実行すると、キャッシュ メカニズムにより、ラウンド トリップは再度実行されません。とにかく、実行ループ内でリクエストを実行することを避けることができ、そのリクエストをループの外に移動するだけです。
約performFetch:
FRC に送信されたメッセージ
はい
呼び出した後、fetchedObjects を使用して管理対象オブジェクトの配列を返します。
[_fetchedResultsController objectAtIndexPath:indexPath];
はい。ただし、テーブル内の特定のセルにデータを入力している場合は、オブジェクトを取得することもできます。
ここで、 NSFetchedResultsControllerに関する素晴らしいチュートリアルを読むことを本当にお勧めします
テーブル ビューの場合: FRC は、特に管理対象オブジェクトとテーブル ビューの行の同期を維持するためのものであり、performFetch を使用してそのプロセスを初期化します。
はい、 はNSFetchedResultsController
と組み合わせて機能しNSManagedObjectContext
ます。さらに、データの遅延読み込みを可能にします。取得した 1000 個の要素があり、それらを に表示したいとしますUITableView
。likeのリクエストを設定するNSFetchRequest
:
[fetchRequest setFetchBatchSize:20];
のインスタンスでそれを使用すると、NSFetchedResultsController
最初に20個の要素をロードできます。次にスクロールすると、他の 20 個の要素が読み込まれます。がないと、NSFetchedResultsController
この動作を手動で実装する必要があります。詳細については、私が提供したチュートリアルを参照してください。
頻度: 多くの場合、1 回のみ。FRC のフェッチ要求が変更されない限り、performFetch を再度呼び出す必要はありません
それはあなたが何を達成したいかによります。ほとんどの場合、一度呼び出すことができます。
それが役立つことを願っています。
編集
performFetch
明示的に呼び出す必要があります。NSFetchedResultsController
ヘッダー ファイル (.h)に次のようなプロパティを作成したい
@property (nonatomic, strong, readonly) NSFetchedResultsController* fetchedResultsController;
のように実装ファイル (.m) に合成します。
@synthesize fetchedResultsController = _fetchedResultsController;
次に、常に .m ファイル内でゲッターをオーバーライドして、その新しいインスタンスを作成します。
- (NSFetchedResultsController*)fetchedResultsController
{
// it already exists, so return it
if(_fetchedResultsController) return _fetchedResultsController;
// else create it and return
_fetchedResultsController = // alloc-init here with complete setup
return _fetchedResultsController;
}
完了したら、クラス内(viewDidLoad
メソッド内など)で次のように使用します
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
// Handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}