我一直在网上关注一些使用NSManagedObjectContext的例子。似乎虽然没有一个示例在AppDelegate的didFinishLoadingWithOptions方法中手动初始化NSManagedObjectContext的实例,但您必须将_managedObjectContext设置为self.managedObjectContext。这在其他类中似乎没有必要,例如控制器?
@synthesize managedObjectContext = _managedObjectContext;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (_managedObjectContext == 0) {
// This is the output shown in the log.
NSLog(@"Not set.");
} else {
NSLog(@"It's set!");
}
if (self.managedObjectContext == 0) {
NSLog(@"Not set.");
} else {
// This is the output shown in the log.
NSLog(@"It's set!");
}
// Should this line be necessary?
_managedObjectContext = [self managedObjectContext];
_navigationController = (UINavigationController*)self.window.rootViewController;
_chordViewController = (ChordViewController*) _navigationController.topViewController;
[_chordViewController setManagedObjectContext: _managedObjectContext];
return YES;
}
答案 0 :(得分:0)
根本不需要这条线。
您基本上已将managedObjectContext变量设置为自身。它在技术上不会伤害任何东西,但也没有帮助。
在你的app委托文件中,你应该有一堆样板代码来创建和管理上下文。如果不这样做,可能是因为您在创建项目时未选择“使用核心数据”选项。在创建新项目以使用核心数据时,请确保选中该框。它将确保在您的应用程序委托文件中插入用于创建托管对象上下文的正确代码。
编辑:确保您的应用代理中包含此代码:
// Returns the managed object context for the application.
// If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
如果那个代码在那里,你应该全部设置。核心数据是一个棘手的问题,但它应该与锅炉板代码正常工作。您应该始终调用self.managedObjectContext以确保调用此方法。不要尝试直接访问_managedObjectContext。这将绕过正确初始化MOC的代码。