我是一名有用的助手,可以为您翻译文本。以下是我翻译的结果:
但我不明白为什么这种行为会改变。在NSManagedObjectContext的文档中,您可以阅读到以下内容:
“这样做的后果是,上下文认为默认所有者是分配它的线程或队列 - 这是由调用其init方法的线程确定的。”
因此,在我的第一个示例中,使用简单的init调用,上下文的队列所有者是主线程。 performBlock:调用也在主线程上进行,因此我不明白为什么会出现此错误。我有什么遗漏还是iOS 8中的一个错误?
我有一个旧项目(从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中的一个错误?