Ios 如何理解CoreData';苹果的父/子模型&x27;谁的文件?

Ios 如何理解CoreData';苹果的父/子模型&x27;谁的文件?,ios,objective-c,multithreading,core-data,Ios,Objective C,Multithreading,Core Data,让我们看看苹果关于CoreData并发性的文档: 通常,避免在与用户无关的主队列上进行数据处理。数据处理可能是CPU密集型的,如果在主队列上执行,可能会导致用户界面无响应。如果您的应用程序将处理数据,例如从JSON将数据导入核心数据,请创建专用队列上下文并在专用上下文上执行导入。以下示例显示了如何执行此操作: 根据代码,我认为如果主队列上下文是根上下文,它将阻塞主队列。我认为私有队列中的上下文应该是根上下文,而主队列的上下文是子上下文 根据代码,我认为它将阻塞主队列,因为父上下文位于主队列中 不

让我们看看苹果关于CoreData并发性的文档:

通常,避免在与用户无关的主队列上进行数据处理。数据处理可能是CPU密集型的,如果在主队列上执行,可能会导致用户界面无响应。如果您的应用程序将处理数据,例如从JSON将数据导入核心数据,请创建专用队列上下文并在专用上下文上执行导入。以下示例显示了如何执行此操作:

根据代码,我认为如果主队列上下文是根上下文,它将阻塞主队列。我认为私有队列中的上下文应该是根上下文,而主队列的上下文是子上下文

根据代码,我认为它将阻塞主队列,因为父上下文位于主队列中

不,不会,至少在显示的代码中不会。数据将在后台线程上处理,并在保存私有上下文时推送到主线程上下文中(请注意,不会将其保存到磁盘)

我认为私有队列中的上下文应该是父上下文,而mainContext是子上下文

这一部分很有趣,因为这个例子应该更进一步。。。如果主线程上下文是根上下文,则任何磁盘保存都将在主线程上运行。不清楚你是不是这个意思,但看起来是这样的


因此,是的,您应该有一个私有队列上下文作为连接到PSC的根,然后将main作为它的子级。导入的专用队列上下文通常是main的子级,但它们可以是同级。如果您选择同级路由,则可以最大限度地减少主线程时间,但这意味着您需要自己处理合并主线程上下文的更改…

谢谢您的回答。在我的问题中,我的意思是如果主队列上下文是根上下文,它将阻塞主队列。是否正确?仅当您保存主线程上下文时,因为这样会将数据写入磁盘(如果主线程上下文是根并连接到PSC)。当你保存孩子时,它不会阻塞main,当它合并时,可能会有一点点…你是说当我保存孩子的上下文时,它只会将更改合并到父上下文,但不会将更改保存到磁盘?如果要将更改保存到磁盘,我必须手动保存根上下文。我是否理解您的想法正确?您必须依次将所有父级保存到根,子级保存将保存该子级并合并到父级,但仅此而已,非常感谢。你解决了困扰我很久的问题。
NSArray *jsonArray = …; //JSON data to be imported into Core Data
NSManagedObjectContext *moc = …; //Our primary context on the mainqueue


NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[private setParentContext:moc];

[private performBlock:^{
for (NSDictionary *jsonObject in jsonArray) {
    NSManagedObject *mo = …; //Managed object that matches the incoming JSON structure
    //update MO with data from the dictionary
}
NSError *error = nil;
if (![private save:&error]) {
    NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
    abort();
}
}];