我在我的应用中使用多上下文核心数据方案。我有一个方法- (void)getCurrencysWithParentContext:(NSManagedObjectContext*)parentContext;
的网络请求类
在这里,我创建一个解析xml-answer的操作。此操作具有自己的NSPrivateQueueConcurrencyType
上下文。在操作结束时我打电话给
if ([self.managedObjectContext save:&error])
{
__weak typeof(self) weakSelf = self;
[self.parentContext performBlock:^{
NSError *error;
if (![weakSelf.parentContext save:&error])
{
NSLog(@"Parent context context save error %@", error);
}
}];
}
else
NSLog(@"Child context save error %@", error);
self.managedObjectContext.insertedObjects
返回没有的实体
零属性:
(实体:货币;身份证明: 0x7a7b8cb0 ; 数据:{ charCode = RUR; 名义= 1; orderNo = 0; 率=( ); sbrfID = nil; sign =“\ U20bd”;
但是weakSelf.parentContext.insertedObjects
会返回
(entity:Currency; id:0x7a7b8cb0 ; 数据:{ charCode = nil; 名义= 0; orderNo = 0; 率=( ); sbrfID = nil; sign = nil;对于相同的objectID。
为什么呢?我做错了什么?如何正确地将更改推送到父上下文?
答案 0 :(得分:0)
来自核心数据编程指南:
在后台线程中保存容易出错
异步队列和线程不会阻止应用程序退出。 (具体来说,所有基于NSThread的线程都是“分离的” - 请参阅pthread的文档以获取完整的详细信息 - 并且只有在所有未分离的线程都退出之后才会运行进程。)因此,如果在后台线程中执行保存操作,它可能会在能够完成之前被杀死。如果需要保存在后台线程上,则必须编写其他代码,以便主线程阻止应用程序退出,直到完成所有保存操作。
只需保存子上下文,如果成功,则保存父上下文,而不必费心使用并发API。