根据 Apple,我在 App Delegate 中创建我的核心数据堆栈,然后将 managedObjectContext 传递给我的第一个控制器,然后从那里传递到第二个控制器,依此类推。
我正在尝试在后台线程中做一些工作并想使用 PrivateConcurrency 类型,但我收到错误消息,即父级必须是 Main 或 Private。
在应用程序委托中,我创建了上下文
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
然后我将它传递给我的第一个控制器
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
Paperwoven_LoadingViewController *firstController = (Paperwoven_LoadingViewController *)navigationController.topViewController;
[firstController setManagedObjectContext:[self managedObjectContext]];
NSLog(@"concurrency type is %@", [self managedObjectContext]);
NSLog(@"concurrency type is %u",firstController.managedObjectContext.concurrencyType);
我可以看到,当我从 self 注销并发类型时,我得到 2,即 Main。但是当我检查我刚刚发送到第一个控制器的上下文时,我得到 0。为什么它没有正确传递?
编辑
此外,我可以通过获取 managedObjectContextAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]
并且我可以看到并发类型是 MAIN 但如果在下一行我self.managedObjectContext = appDelegate.managedObjectContext
检查了 self.managedObjectContext 上的并发类型,它是 0。看起来将它从 App 委托分配给控制器会丢失并发类型.