插入的托管对象属性为零

时间:2014-12-13 17:58:57

标签: ios objective-c multithreading core-data

我在我的应用中使用多上下文核心数据方案。我有一个方法- (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。

为什么呢?我做错了什么?如何正确地将更改推送到父上下文?

1 个答案:

答案 0 :(得分:0)

来自核心数据编程指南:

  

在后台线程中保存容易出错

     

异步队列和线程不会阻止应用程序退出。 (具体来说,所有基于NSThread的线程都是“分离的” - 请参阅pthread的文档以获取完整的详细信息 - 并且只有在所有未分离的线程都退出之后才会运行进程。)因此,如果在后台线程中执行保存操作,它可能会在能够完成之前被杀死。如果需要保存在后台线程上,则必须编写其他代码,以便主线程阻止应用程序退出,直到完成所有保存操作。

只需保存子上下文,如果成功,则保存父上下文,而不必费心使用并发API。