【发布时间】:2014-11-10 14:41:22
【问题描述】:
我有一个使用这个简单代码的旧项目(从 iOS 7 开始):
在 AppDelegate 中我创建了 managedObjectContext:
- (NSManagedObjectContext *)managedObjectContext {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
}
然后,我在视图控制器中执行更新操作:
[context performBlock:^{
[context deleteObject:anObject];
NSError *error = nil;
if (![context save:&error])
{
NSLog(@"Error saving context");
}
}];
我确定这段代码在 iOS 7.0 上可以正常运行,但在 iOS 8 上的 performBlock: 调用中崩溃并出现以下错误:
只能在使用队列创建的 NSManagedObjectContext 上使用 -performBlockAndWait:。
我可以像这样解决更改 NSManagedObjectContext 实例的 init 方法的错误:
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
但我不明白为什么这种行为会改变。在 NSManagedObjectContext 的文档中,您可以阅读:
这样做的结果是上下文假定默认所有者是分配它的线程或队列——这由调用其 init 方法的线程确定。
因此,在我的第一个示例中,使用简单的init 调用,上下文的队列所有者是主线程。
performBlock: 调用也是在主线程上进行的,所以我不明白为什么会出现这个错误。是我遗漏了什么还是 iOS 8 中的错误?
【问题讨论】:
标签: objective-c core-data