我想确保我的主线程永远不会阻塞,这就是我想在后台进行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需要在另一个线程中初始化,但我不能让这种方法起作用。
答案 0 :(得分:0)
(来自评论)
所有“新”托管对象上下文类型(NSMainQueueConcurrencyType
,NSPrivateQueueConcurrencyType
)管理自己的线程,没有必要在特殊线程上创建上下文。唯一要记住的是始终使用performBlock
或performBlockAndWait
进行上下文中的操作。这可确保在正确的队列和线程上执行操作。
所以你的代码没问题。
(事实证明,错误是错误的上下文传递给了您的保存例程,因此内部保存未在顶级上下文中完成。)