1

1. 从两个视图中使用相同 Core Data 上下文的最佳方式是什么?

我有一个带有两个 ViewController 的 TabBarController。首先我想记录一个时间,应该存储。在第二个有一个 TableView 显示所有记录。我按照教程中的说明进行操作,并在 App Delegate 中启动所有 ManagedDataContext 内容并将其传递给我的控制器:

- (void)applicationDidFinishLaunching:(UIApplication *)application {

   SecondViewController *tableController = [[SecondViewController alloc] init];
   tableController.managedObjectContext = [self managedObjectContext];

   self.navigationController = [[UINavigationController alloc] initWithRootViewController:tableController];

   [window addSubview: [self.navigationController view]];
   [window makeKeyAndVisible];
}

但是当我多次使用这个变量时(也在同一个类中)我得到一个(某种空指针)错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Event''

在调试时,我发现这里的 managedObjectContext 为空:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];

这里有什么问题?什么是视图的最佳解决方案?

可以使用单例吗?

- (NSManagedObjectContext *) managedObjectContext {

    if (managedObjectContext != nil) {
        NSLog(@"managedObjectContext already in use. Returning instance.");
        return managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }

    NSLog(@"managedObjectContext nil. Returning new instance.");
    return managedObjectContext;
}

2. 是否可以存储与数据模型不同的对象?

我需要我的班级不要存储我的其他对象。就像我不想保存的数组一样。这可能吗?

4

1 回答 1

2

1.您正在使用标签栏控制器。该选项卡栏上的视图控制器需要具有属性,例如 managedObjectContext。如果您通过故事板或 nib 使用 tabbarcontroller,您可以通过 tabbarcontroller 上的 viewControllers 属性获取 viewControllers 并设置 managedObjectContext:

UITabBarController * tabBarController = (UITabBarController *) self.window.rootViewController;

// the first tab is a navcontroller, which contains as a rootVC a custom VC with a property for the MOC
UINavigationController          * navController = (UINavigationController *)[tabBarController.viewControllers objectAtIndex:0]; 
MyViewController1  * rootVCOfNavController          = (MyViewController1 *)     [[historyNavigationController viewControllers] objectAtIndex: 0];

// the second tab of the tabbarcontroller is a custom VC with a MOC property
MyViewController2   * viewController2  = (MyViewController2 *)[tabBarController.viewControllers objectAtIndex:1];

viewController1 = self.managedObjectContext;
rootVCOfNavController.managedObjectContext = self.managedObjectContext;

这将确保第一个“裸”视图控制器获得 MOC,以及嵌入在 NavigationController 中的视图控制器。这应该处理第一个错误。为此,您需要很好地了解您的 viewController 层次结构(注意:viewController 层次结构不等于 view-hierarchy)。

在这种情况下,使用单例将是解决您不完全理解的问题的一种解决方法,因此是不明智的。在某些情况下单例是完美的,但现在你的 appDelegate 可以很好地完成这个角色。

2.我不太清楚你的意思。未在数据模型中定义的对象不能存储在核心数据中。但是,您可以将对象保存在不同的模型中(具有自己的核心数据堆栈)。或者以其他方式坚持它们。但我猜你的意思是别的。假设您的意思是您有一些不需要保存的 managedOjects 'Class',您可以制作一个辅助 MOC,并且永远不要保存它。您还可以将其设置为原始 MOC 的子 MOC,因此它将获取该原始 mod 的持久存储中存在的所有数据,但新对象将仅存在于子 MOC 中。保存子 MOC 会将新对象向上移动到原始 MOC 中,保存该对象会将它们持久保存到磁盘。同样,我不知道您对第二个问题的确切含义。

于 2013-09-07T15:28:53.243 回答