我正在尝试创建一个临时的托管对象上下文,在用户输入信息的几个屏幕之后,我将该上下文与主上下文合并(以确保没有插入“不完整”的对象)。这就是我创建临时上下文以及如何在其中插入对象的方法:
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。我可以看到为什么局部变量不再可用(它只是超出范围),但是应该仍然设置托管对象的属性,对吗?
我知道我可以创建一个属性来存储托管对象上下文,但我宁愿让它以这种方式工作。
答案 0 :(得分:15)
我最近又遇到了同样的问题,尽管情况不同。我需要一个临时的托管对象上下文,与主要上下文完全分开,但是我再次遇到它在超出范围后消失的问题。这一次我决定进一步调查,我最终意识到managedObjectContext
不是NSManagedObject
的属性,而是一种方法。这意味着以下两件事之一:
在任何一种情况下,上下文都没有强引用,超出范围,NSManagedObject
有nil
managedObjectContext
。
解决方案是通过为它创建一个强大的属性来简单地保持上下文。
答案 1 :(得分:-2)
我不明白为什么你需要第二个托管对象上下文。恕我直言,您正在为您的应用程序引入复杂性,不会出于任何特定目的。
将新对象插入主上下文。让用户输入他的数据。如果他中断,只需致电
[managedObjectContext rollback];
或者,如果用户完成并验证了所有数据,请致电
[managedObjectContext save:nil];