Ios5 NSManagedObjectContext执行锁定和调度组

Ios5 NSManagedObjectContext执行锁定和调度组,ios5,core-data,grand-central-dispatch,nsmanagedobjectcontext,Ios5,Core Data,Grand Central Dispatch,Nsmanagedobjectcontext,问题是我需要将NSManagedObject的子类从0修改(更新/创建/删除)到10000。当然,如果您可以创建多个上下文,并在每个上下文上处理一部分数据…?根据您的描述,您似乎在抓救命稻草以恢复性能 核心数据文件I/O性能由SQLite的单线程特性决定。让多个上下文在同一个商店协调员身上运行并不会使事情进展得更快 要提高性能,您需要以不同的方式进行操作。例如,您可以将后台写入批处理到更大的操作中。(如何操作?在保存之前,您需要在每个GCD块中执行更多操作。)您可以使用Core Data的调试工

问题是我需要将NSManagedObject的子类从0修改(更新/创建/删除)到10000。当然,如果您可以创建多个上下文,并在每个上下文上处理一部分数据…?

根据您的描述,您似乎在抓救命稻草以恢复性能

核心数据文件I/O性能由SQLite的单线程特性决定。让多个上下文在同一个商店协调员身上运行并不会使事情进展得更快


要提高性能,您需要以不同的方式进行操作。例如,您可以将后台写入批处理到更大的操作中。(如何操作?在保存之前,您需要在每个GCD块中执行更多操作。)您可以使用Core Data的调试工具查看获取和保存所发出的SQL类型。(有很多方法可以提高CD提取性能,只有很少的方法可以提高保存性能。)

好的,各位,在我完成所有我想要的功能后,我发现了以下几点:

具有不同PrivateQueue和NSManagedObjectContext结果的调度组:

格式为“实体数/秒”:

  • 333/6
  • 1447/27
  • 3982/77
单后台线程(NSManagedObjectContext+NSPrivateQueueConcurrencyType+performBlock:)

  • 333/1
  • 1447/8
  • 3982/47

所以我想我不应该再试一次,还有很多其他问题,比如在合并大量上下文(甚至在后台)时应用程序冻结。我将尝试其他方法来提高性能。

您在
saveBlock
中做什么?您是否为每个添加的实体保存一次?基本上,我正在更新所有接收对象的数据,管理删除/添加的对象,通过使用接收的JSONDictionary枚举和更新NSManagedObjects来更改某些状态。我已经在使用privateBackgroundQueue将数据保存到磁盘,我的上下文方案如下所示:privateBackgroundDBSavingContext->mainThreadContext->TempBackgroundContext。(->表示父级->子级),因此在保存mainThreadContext后,所有数据库都将存储到带有privateBackgroundDBSavingContext的磁盘上。我将尝试跟踪其他可以提高DB性能的方法
+ (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();
                }
            });
        }
    }];
}