0

アプリに「ノートブック」エンティティを持つ Core Data モデルがあります。1 つまたは複数の「ノートブック」インスタンスにアクセスするには、次の 2 つの方法があります。

  • 特定の「タイトル」または「インデックス」属性を持つインスタンスを要求する述語で NSFetchRequest を実行する。
  • Core Data モデルに 'AppData' エンティティを追加することで、'Notebook' の 'index' 属性を省略し、代わりに 'AppData' から 'Notebook' への対多の順序付き関係を作成します。次に、最初のアプリの起動時に「AppData」インスタンスを作成し (その後の起動のたびに、その唯一の「AppData」インスタンスを要求してフェッチします)、対多関係を通じてすべての「ノートブック」インスタンスにアクセスします。タイトルでノートブックにアクセスするには、indexOfObjectPassingTest または高速な obj-c 列挙を使用します。インデックスでアクセスするには、objectAtIndex を使用します。

「ノートブック」インスタンスとその属性について「AppData」インスタンスをクエリする方が、管理対象オブジェクト コンテキストに毎回フェッチ要求を設定するよりもはるかに簡単です。

しかし、どちらの方法がより高速でしょうか? 1 つのメソッドがより多くのメモリを使用するか、より多くの時間をメモリ内にとどめるでしょうか? 対多関係のオブジェクトは遅延ロードされると読みましたが、そのセットのオブジェクトはいつロードされますか? いつアンロードされますか?

4

1 に答える 1

2

AppDataエンティティは冗長に見えます。Notebook最初にそれを取得する必要があるため、代わりにすべてのインスタンスを取得してみませんか? フィルタリング (タイトル、その他の ID 属性による) は、両方のシナリオで同じです。

フェッチ リクエストは面倒である必要はありません。

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Notebook"];
NSArray *fetchedObjects = [moc executeFetchRequest:fetch error:nil];

また、データの量に応じて、これらのインメモリをフィルター処理するか、フェッチ リクエストに述語を含めることができます。

間違いなく、シナリオに関係なく、「インデックス属性」の考えを忘れてください。Core Data はデータベースではなく、オブジェクト グラフです。これを正当化する唯一の理由は、一意の識別子を使用する外部フレームワークまたはデータ ストアと同期する必要がある場合です。

便宜上、管理対象オブジェクトのカテゴリにメソッドを作成できます。

+(NSArray*) appNotebooks {
   NSArray * fetchedResults = // fetch the appropriate entities
   return fetchedResults;
}

次に、次のように使用します。

Notebook.appNotebooks;
于 2013-03-29T13:57:16.107 に答える