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始终保存在主线程中。我认为,将主上下文始终放在主线程上是一个好主意,这样可以方便地在不同线程之间进行同步