2

を使用してアプリケーションでコアデータを設定していますUIManagedDocumentNSManagedObject次に、ループでデータベースに約1000(s)を追加します。私は最初、以下を使用してバックグラウンドスレッドのオブジェクトのデータを処理しています。

dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(backgroundQueue, ^{
    // PROCESS OBJECTS HERE
    ...
    ...

バックグラウンドスレッドからCoreDataに追加する前に:

NSManagedObjectContext *moc = [[self managedDocument] managedObjectContext];
[moc performBlock:^{
    // ADD TO CORE DATA
    ...
    ...

使用:

// CREATE
Fruit *fruit = [NSEntityDescription insertNewObjectForEntityForName:@"Fruit" inManagedObjectContext:context];
// POPULATE
[fruit setName:name];
[fruit setAge:age];
[fruit setType:type];
...

私の質問は:

1000以上のオブジェクトに対して上記を実行すると、現在約2.2秒かかります。すべてのオブジェクトが挿入されるまで、Core Dataの保存は実行しないため、I/Oオーバーヘッドなしですべてがメモリ内で実行されます。上記のように、すべての処理はバックグラウンドスレッドで実行されますが、新しいオブジェクトをCore Dataに挿入する場合は、performBlock:を使用して、UIManagedDocumentが元々あったメインスレッドで挿入が行われるようにする必要があります。作成した。

私が知りたいのは、オブジェクトの挿入を高速化する方法があります。おそらく、多数のNSManagedObjectを「バッチ処理」して、1回のヒットで追加する方法がありますか、それとも同じ時間がかかるのでしょうか。私は今やっています(まだ1000以上のオブジェクトを追加しています)。

新しいコンテキストを作成し、それをNSManagedDocumentコンテキストとマージすることについて何か読んだことがありますが、それが適切かどうか、または適切である場合はどのように行うかがわかりません。ヘルプ/情報をいただければ幸いです。

4

1 に答える 1

2

1)コンテキストのundomanagerをnilに設定します。

[moc setUndoManager:nil]

保存中に元に戻す予定がない場合は、元に戻す情報は必要ありません。

2)1回の保存で多数のオブジェクトを追加することにより、すでにバッチ処理を行っています。

3)小さいバッチサイズで実験します。1000で十分なはずですが、最後に1つの大きな保存が問題になる可能性があります。

4)バッチサイズを変更した場合は、作成したオブジェクトを解放してみることもできます。

于 2012-10-24T02:49:41.460 に答える