12

2つの比較に関する完全なリストが必要です。私が知っていること:

executeFetchRequest:

  • MOC に送信されたメッセージ
  • 管理対象オブジェクトの配列を返す
  • 目標: 永続ストアから MOC にオブジェクトをフェッチする
  • テーブル ビューあり: テーブル ビューとは関係ありません
  • 頻度: ループで使用されることが多いため、何度も呼び出すことができます

performFetch:

  • FRC に送信されたメッセージ
  • 呼び出した後fetchedObjects、管理対象オブジェクトの配列を返すために使用します
  • テーブル ビューの場合: FRC は、特に管理対象オブジェクトとテーブル ビューの行の同期を維持するためのものであり、performFetchそのプロセスの初期化に使用されます。
  • 頻度: 多くの場合、1 回のみ。FRC のフェッチ要求が変更されない限り、再度呼び出す必要はありませperformFetch

間違っている場合は修正して、リストを追加してください。ありがとうございました。

4

2 に答える 2

16

executeFetchRequest:

MOC に送信されたメッセージ

はい

管理対象オブジェクトの配列を返す

はい。ただし、取得する結果のタイプを変更することもできます。ではNSFetchRequest、次の方法で別の結果タイプを設定できます。

- (void)setResultType:(NSFetchRequestResultType)type

どこNSFetchRequestResultTypeでさまざまなタイプにすることができます。アップルのドキュメントから引用:

enum {
   NSManagedObjectResultType        = 0x00,
   NSManagedObjectIDResultType      = 0x01,
   NSDictionaryResultType           = 0x02
   NSCountResultType                = 0x04
};
typedef NSUInteger NSFetchRequestResultType; 

目標: 永続ストアから MOC にオブジェクトをフェッチする

はい、NSFetchRequestリクエストを作成して実行することは、SQL で SELECT ステートメントを作成することと同じです。も使用する場合は、NSPredicateSELECT-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]);
}
于 2012-09-29T13:16:39.443 に答える
4

間違った要素を比較しています。NSFetchedResultsControllerを使用しNSManagedObjectContextてフェッチを実行し、適切な構成の下で、管理対象オブジェクトコンテキストの変更を監視して、監視しているフェッチプロパティのステータスを確認しますが、実際のフェッチはコンテキストによって実行されます。どちらの場合も、NSManagedObjectContextフェッチを実行します。違いは、直接使用すると、NSArrayタイプのオブジェクト(実際のランタイムクラスは使用する配列とは異なります)NSManagedObjectContextを取得しますが、目的は異なります(結果のコレクションを持ち、レコードとエンティティへの変更を監視する)フェッチ要求時)。つまり、コンテキストを使用して機能しますが、単なるオブジェクトのコレクションとは異なります。[NSArray array]NSFetchedResultsControllerNSFetchedResultsController

1つの観察:ループ内で使用するべきではありませんexecuteFetchRequest。特に「何度も」と呼ぶべきではありません。各フェッチにはパフォーマンスコストがあります。executeFetchRequest一度呼び出すと、ループを実行して結果を確認できます。

于 2012-09-28T18:58:04.943 に答える