我想确保我的主线程永远不会阻塞,这就是为什么我想在后台保存我的核心数据。
我一直在阅读 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 需要在另一个线程中初始化,但我无法使用这种方法。