問題は、0 から 10000 までの NSManagedObject のサブクラスを変更 (更新/作成/削除) する必要があることです。もちろん、<= 1000 の場合はすべて正常に動作します。私はこのコードを使用しています:
+ (void)saveDataInBackgroundWithBlock:(void (^)(NSManagedObjectContext *))saveBlock completion:(void (^)(void))completion {
NSManagedObjectContext *tempContext = [self newMergableBackgroundThreadContext];
[tempContext performBlock:^{
if (saveBlock) {
saveBlock(tempContext);
}
if ([tempContext hasChanges]) {
[tempContext saveWithCompletion:completion];
} else {
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) {
completion();
}
});
}
}];
}
- (void)saveWithCompletion:(void(^)(void))completion {
[self performBlock:^{
NSError *error = nil;
if ([self save:&error]) {
NSNumber *contextID = [self.userInfo objectForKey:@"contextID"];
if (contextID.integerValue == VKCoreDataManagedObjectContextIDMainThread) {
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) {
completion();
}
});
}
[[self class] logContextSaved:self];
if (self.parentContext) {
[self.parentContext saveWithCompletion:completion];
}
} else {
[VKCoreData handleError:error];
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) {
completion();
}
});
}
}];
}
完了は、メインスレッドのコンテキストが保存される場合にのみ発生します。このソリューションは完璧に機能しますが、
サーバーから 1000 を超えるエンティティを取得した場合、オブジェクトの処理を並列処理したいのですが、更新操作に時間がかかりすぎるのが原因です (たとえば、4500 の更新では約 90 秒で、この時間の 1/3 未満では JSON の受信プロセスにかかるため、約 60 秒かかります)。秒 NSManagedObjects をドリルするだけです)。CoreData がなければ、dispatch_group_t を使用してデータをサブ配列に分割し、同時に異なるスレッドで処理するのは非常に簡単ですが、CoreData と NSManagedObjectContexts で同様のものを作成する方法を知っている人はいますか? performBlock: なしで NSPrivateQueueConcurrencyType (iOS 5 スタイル) で NSManagedObjectContext を操作することは可能ですか? また、約 10 個のコンテキストを保存してマージする最良の方法は何ですか? ありがとう!