问题是我需要修改(更新/创建/删除)从 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: 的情况下使用 NSManagedObjectContext 和 NSPrivateQueueConcurrencyType(iOS 5 风格)?保存和合并大约 10 个上下文的最佳方法是什么?谢谢!