1

我想确保我的主线程永远不会阻塞,这就是为什么我想在后台保存我的核心数据。

我一直在阅读 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 需要在另一个线程中初始化,但我无法使用这种方法。

4

1 回答 1

0

(来自评论)

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

所以你的代码没问题。

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

于 2013-02-21T09:08:10.720 回答