1

ペアとアイテムの2つのテーブルのレコードで構成されるデータがあります。これらのテーブルは、多対多の関係でリンクされています。コア データ エンティティを埋める方法は 2 つあります。すでにすべての項目を満たしているとしましょう。今度はペアを埋める必要があります。どちらの場合も、「識別子」は追加のテキスト プロパティ/フィールドです。

方法 1 (NSFetchRequest のみ):

//get data which should be converted to core data entities
id pairsInfoArray = ...; 
for (id pairInfo in pairsInfoArray) {

    //get items by identifier using NSFetchRequest
    id item1 = ...;
    id item2 = ...;
    //create pair entity
    id pair = ...;
    pair.items = [NSSet setWithObjects:item1, item2, nil];
}

方法 2 (NSFetchRequest を 1 回だけ呼び出し、代わりに NSDictionary/NSMutableDictionary を使用します):

//get all items via NSFetchRequest
NSArray *itemsObjArray = ...;
//place all the items into array as key = item.identifier, value = item (as object)
NSMutableDictionary *itemsObjDict = ...;
//get data which should be converted to core data entities
id pairsInfoArray = ...;
for (id pairInfo in pairsInfoArray) {

    //get items by key from itemsObjDict
    id item1 = ...;
    id item2 = ...;
    //create pair entity
    id pair = ...;
    pair.items = [NSSet setWithObjects:item1, item2, nil];
}

すべてのデータ (アイテムとペアだけでなく) は、5 分 (way1) と 45 秒 (way2) の間に満たされます。行う時間も含めて[context save:nil]です。

私が見たように、2番目の方法は最初の方法よりもはるかに高速に機能します。しかし、それには隠れた欠点がありますか?たとえば、アイテムを追加の辞書に保存すると、メモリが無駄になりませんか?

4

2 に答える 2

1

もちろん大きなデメリットがあります。

例 2 では、すべてのデータをメモリに保持しています。もちろん、これは常に最速の方法ですが、モバイル デバイスには最適ではありません。

CoreData はオブジェクト グラフであり、永続ストレージではありません。デフォルトでは、メモリを使用してオブジェクトをすぐに作成することはありません。実際に使い始めるときにオブジェクトを作成します。これは、プロパティを操作することを意味します。小さな参照を保持する前に、いわゆるフォルトです。CoreData はメモリとパフォーマンスのバランスを取り、どのデータをいつメモリにロードするかを制御できるようにします。フェッチから取得した NSArray には、実際にはメモリ内に準備ができているオブジェクトがほとんどありません。要素にアクセスすると、残りが現実になります。通常、常にすべてのオブジェクトが必要になるケースはありません。通常、一部のオブジェクトのいくつかの情報のみを表示する Collectionview がありますが、すべてではありません。もちろん、単純にすべてのオブジェクトをフェッチして、実際にオブジェクトをロードするように指示することもできます。その後、彼は例 2 と同じくらい速くなります。

これに対処する方法を示す優れた WWDC ワークショップがいくつかあります。一般に、CoreData は常に最適なソリューションです。ただし、メモリ内で数 kb しか消費せず、それらを保持しても何の害もない些細なデータについて話している場合を除きます。しかし、時間の数字は、多くのデータがあることを示しています。このデータのすべてが常に必要なわけではありません。それを分割し、表示する必要がある必要な情報を保持するエンティティを作成し、残りを追加のエンティティに入れます。詳細情報が必要な場合は、余分なエンティティにアクセスし、少し遅れてオブジェクトを取得します。(遅延読み込みと呼ばれます)

コア データでの私の提案を試して、NSDictionary ソリューションと比較して、デバイスでの実行時にどれだけのメモリを消費するかを確認してください。違いがわかると思います。

于 2013-10-05T10:15:59.500 に答える