1

新しいエンティティを Core Data モデルに (Magical Record 経由で) 挿入する次のコードがあります。

- (void)insertWithData:(NSDictionary *)dataDictionary {

DLog(@"Inserting %@", [_entityClass description]);

NSManagedObjectContext *context = [NSManagedObjectContext contextForCurrentThread];

id entity = [_entityClass createInContext:context];

[entity setValuesFromDictionary:dataDictionary];

if ([entity isKindOfClass:[Syncable class]]) {
    [entity setValue:YesNumber forKey:@"syncedToServer"];
}

[context save];
}

このコードは、別のクラスから呼び出された FOR ループで複数回実行されるため、パフォーマンスを最適化するために、ループが完了した後にのみコンテキストを保存したいと考えています。

私の質問は、これを行う最善の方法は何ですか? ここでコンテキストへの参照を保存し (アプリ デリゲートなど)、この参照を使用して呼び出し元のクラスに保存する必要がありますか? または、呼び出し元のクラスで NSManagedObjectContext contextForCurrent Thread を再度呼び出して、この参照を使用することもできます。つまり、呼び出し元のクラスで:

NSManagedObjectContext * context = [NSManagedObjectContext contextForCurrentThread];
[context save];
4

3 に答える 3

1

これは次の方法で行うことができます。

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){
    // your for loop
}];

contextForCurrentThread を使用すべきでない理由の詳細については、http: //saulmora.com/2013/09/15/why-contextforcurrentthread-doesn-t-work-in-magicalrecord/ を参照してください。

于 2013-10-01T10:28:21.727 に答える
0

ループの最後に保存したい場合は、NSManagedObjectContext をパラメーターとして渡すことをお勧めします。

- (void) insertData:(id)data inContext:(NSManagedObjectContext *)context;
{
   //do all your data stuff here.

}

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

NSManagedObjectContext *context = [NSManagedObjectContext MR_confinementContext];
for (id obj in objCollection)
{
   [self insertData:obj inContext:context];
}
[context MR_save];
于 2013-10-01T15:44:19.213 に答える
-1

はい、ループ後にコンテキストを保存できます。各反復で保存するよりもはるかに優れています。MagicalRecord src を調べると、MR_contextForCurrentThreadMagicalRecord が作成するスレッドのコンテキストがない場合、同じスレッドに対して常に同じコンテキストを返すことがわかります。
また、 context を渡す必要はありません。現在のスレッドのコンテキストで作成されます[_entityClass createInContext:context][_entityClass MR_createEntity]

于 2013-10-01T10:23:32.183 に答える