7

我正在尝试创建一个临时托管对象上下文,并且在用户输入信息的几个屏幕之后,我将该上下文与主上下文合并(以确保没有插入“不完整”的对象)。这就是我创建临时上下文以及在其中插入对象的方式:

if (!self.someManagedObject) {

    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:@[[NSBundle mainBundle]]];
    NSPersistentStoreCoordinator *storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    [storeCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:nil];

    NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator:storeCoordinator];

    self.someManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"SomeObject" inManagedObjectContext:managedObjectContext];
    NSLog(@"%@", self.someManagedObject.managedObjectContext);
}

这是 的一部分viewDidLoad。在控制台中,它显示托管对象上下文有一个值。

但是,在这个 if 语句之后(即使在viewDidLoad,内self.someManagedObject.managedObjectContext也是 nil。我可以看到为什么局部变量不再可用(它只是超出了范围),但仍应设置托管对象的属性,对吗?

我知道我可以创建一个属性来存储托管对象上下文,但我宁愿让它以这种方式工作。

4

2 回答 2

19

我最近又遇到了同样的问题,尽管情况不同。我需要一个临时托管对象上下文,与主对象上下文完全分开,但我再次遇到了它在超出范围后消失的问题。这一次我决定进一步研究,我最终意识到这managedObjectContext不是一个属性NSManagedObject,而是一个方法。这意味着两件事之一:

  1. 如果它在底层实现中使用一个属性,该属性将不会持有对上下文的强引用
  2. 如果托管对象上下文是以其他方式派生的,它也不会持有对该上下文的强引用。

在任何一种情况下,上下文都没有强引用,超出范围,并且NSManagedObjects 有一个nil managedObjectContext.

解决方案是通过为其创建强大的属性来简单地保留上下文。

于 2013-10-19T19:16:32.773 回答
-3

我不明白为什么您需要第二个托管对象上下文。恕我直言,您正在将复杂性引入您的应用程序中,而这并不适用于任何特定目的。

将新对象插入主上下文。让用户输入他的数据。如果他中断,只需调用

[managedObjectContext rollback];

或者,如果用户完成并验证了所有数据,则调用

[managedObjectContext save:nil];
于 2012-08-04T11:18:12.903 回答