iOS后台保存在Core Data中

时间:2013-02-20 09:58:10

标签: ios ios5 core-data asynchronous nsmanagedobjectcontext

我想确保我的主线程永远不会阻塞,这就是我想在后台进行Core Data保存的原因。

我一直在阅读Apple文档和这个链接(以及其他许多人,但我发现这个非常有用):http://www.cocoanetics.com/2012/07/multi-context-coredata/,虽然我无法使架构正确。

在我的AppDelegate.m中:

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _saveContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        [_saveContext setPersistentStoreCoordinator:coordinator];

        _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [_managedObjectContext setParentContext:_saveContext];
    }
    return _managedObjectContext;
}

然后保存,我会做这样的事情:

// var 'context' is the context coming from method managedObjectContext
// this code is in the same thread 'context' is created in (the main thread)
NSError *error = nil;
if ([context save:&error]) {
    [context.parentContext performBlock:^{
        NSError *err = nil;
        if(![context.parentContext save:&err]) {
            NSLog(@"Error while saving context to the persistent store");
        }
    }];
} else {
    // handle error
}

这是我从阅读我之前提供的链接时得到的。保存不起作用,关闭并重新打开应用程序后,对任何托管对象所做的更改都将消失:它们从未保存到持久存储中。

有道理我猜是因为我在1个线程中创建了2个NSManagedObjectContexts,Apple文档清楚地表明每个线程只有1个NSManagedObjectContext。那么如何设置_managedObjectContext和_saveContext之间的父/子关系?我知道_saveContext需要在另一个线程中初始化,但我不能让这种方法起作用。

1 个答案:

答案 0 :(得分:0)

(来自评论)

所有“新”托管对象上下文类型(NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType)管理自己的线程,没有必要在特殊线程上创建上下文。唯一要记住的是始终使用performBlockperformBlockAndWait进行上下文中的操作。这可确保在正确的队列和线程上执行操作。

所以你的代码没问题。

(事实证明,错误是错误的上下文传递给了您的保存例程,因此内部保存未在顶级上下文中完成。)