Ios 如何从子队列保存父NSManangedObjectContext?

Ios 如何从子队列保存父NSManangedObjectContext?,ios,core-data,Ios,Core Data,我有以下设置: NSManagedObjectContext *parent = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; // other setup for parent NSManagedObjectContext *child = [[NSManagedObjectContext alloc]

我有以下设置:

NSManagedObjectContext *parent = [[NSManagedObjectContext alloc] 
                            initWithConcurrencyType:NSMainQueueConcurrencyType];
// other setup for parent

NSManagedObjectContext *child = [[NSManagedObjectContext alloc] 
                          initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:parent];
我想要的是在孩子保存时保存家长,所以目前我会这样做:

[child performBlock^{
      [child save:nil];
      [parent performBlock:^{
          [parent save:nil];
      }
}];
这就是我为了安全,在上下文自己的队列中调用save。有必要吗?我可以这样做吗:

[child performBlock^{
     [child save:nil];
     [parent save:nil];
}];

不,您不能使用第二个变体。您将对与子上下文关联的队列上的父上下文执行
save
操作,而不是主队列

这意味着
save
操作将在(可能)与主线程不同的线程上执行,这是不允许的,因为托管对象上下文不是线程安全的

另见 在OS X v10.7和iOS 5.0的核心数据发行说明中:

您可以使用中基于队列的并发类型来使用上下文 结合两种新方法:
performBlock:
performBlockAndWait:
。。。唯一的例外是:如果您的代码是 在主线程上执行时,可以调用主队列上的方法 直接设置上下文样式,而不是使用基于块的API

performBlock:
performBlock和wait:
确保阻塞操作 在为上下文指定的队列上执行


您需要调用主上下文来保存在它自己的队列中,我假设您使用主队列作为父上下文,这样您就可以这样做

[child performBlock^{
     [child save:nil];
     [parent performSelectorOnMainThread:@selectorr(save:) withObject:nil waitUntilDone:NO];
}];
此代码将确保父ManagedObjectContext始终保存在主线程中。我认为,将主上下文始终放在主线程上是一个好主意,这样可以方便地在不同线程之间进行同步