NSManagedObjectContext异步导入,保存并通知主上下文

时间:2013-09-29 11:26:15

标签: iphone core-data nsmanagedobjectcontext

我有父子上下文如下: 1.带有NSPrivateQueueConcurrencyType的writercontext 2.带有NSMainQueueConcurrencyType ParentContext:writercontext的mainContext 3.和NSPrivateQueueConcurrencyType ParentContext:writercontext

的背景情境

如何通过后台上下文所做的更改来通知主要上下文?

我已阅读the last part: async save,但不会在后台保存或导入,并且会阻止用户界面和无响应。有没有办法在背景中使用子父上下文并仍然通知主要上下文?

目前我保存了我的上下文:

[context performBlockAndWait:^{
    @try {
        NSError *childError = nil;
        if ([context save:&childError])
        {
            [context.parentContext performBlockAndWait:^{
                NSError *parentError = nil;
                if ([context.parentContext save:&parentError])
                {
                     //saved
                }
                else
                {
                    nslog(@"Error: %@", parentError.description);
                }
            }];
        }
        else
        {
            DBERROR(@"Error: %@", childError.description);
        }
    }
    @catch (NSException *exception)
    {
        DBERROR(@"Exception: %@", exception.description);
    }

}];

1 个答案:

答案 0 :(得分:0)

我认为context是你的背景背景。 如果从主线程调用performBlockAndWait,它将被阻塞,直到块完成。您应该用以下代码替换您的代码:

[context performBlock:^{

...

}];

这样主线程就不会被阻塞,因为该块将在另一个线程上执行。

至于保存,我猜您的更改不会传播到mainContext。我自己没有使用过嵌套的上下文,所以我不确定它为什么会这样工作(也许你需要手动合并上下文之间的变化)。