2012-08-02 91 views
5

我试图创建一个临时的托管对象上下文,并在用户放入信息的几个屏幕后,我将该上下文与主上下文合并(以确保没有“不完整”对象被插入)。这是我创造我临时的上下文,我怎么插入一个对象:NSManagedObject的managedObjectContext属性为零

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语句(即使在viewDidLoadself.someManagedObject.managedObjectContext是零。我可以看到为什么局部变量将不再提供(它只是超出范围),但被管理对象的属性应该还是设置吧?

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

+0

是'someObject'与'someManagedObject'相同吗? – aforaudrey 2012-08-02 23:04:17

+0

哎呀,是的。我先放了'someObject',但后来想澄清它是一个NSManagedObject。 – 2012-08-02 23:35:01

+0

你已经检查过'self.someManagedObject'是否为非零?假设'insertNewObject ...'失败或者你的属性是特殊的,那将解释你所看到的。 – Tommy 2012-08-02 23:44:47

回答

15

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

  1. 如果它使用一个属性在底层实现,该属性will not hold a strong reference上下文
  2. 如果被管理对象上下文以其他方式得到的,它也不会举行强烈地提到这种情况。

在这两种情况下,上下文没有强引用,超出范围,和NSManagedObject■找一个nilmanagedObjectContext

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

+0

你知道这是为什么吗? (我有一个单独的SO [问题](http://stackoverflow.com/q/23687160/1108362))...) – jsadler 2014-05-15 19:36:21

-2

我不明白你为什么会需要第二个管理对象上下文恕我直言,你正在为你的应用程序引入复杂的功能,而不是用于任何特定的用途。

将新对象插入主要上下文中。让用户输入他的数据。如果他打破了,只需拨打

[managedObjectContext rollback]; 

,或者,如果用户完成所有的数据进行验证,调用

[managedObjectContext save:nil]; 
+0

这似乎也是一个很好的解决方案,但是'rollback'离多远呢?到最后保存?我有点依赖于自动保存,所以我不得不手动地调用'save'然后(这不是问题,但我必须知道)。 – 2012-08-04 18:08:34

+0

最后一次保存 - 可能比这更复杂一点,但只能在特殊情况下使用。 - 另外,我不知道“自动保存”。当然最好明确地做。 – Mundi 2012-08-04 20:08:24

+0

我这样做有一个问题:我必须检查所有可能的方式,用户可以避免填写所有信息。而不是检查用户是否做了“错误”(如过程中断),我希望能够在流程完成时保存。通过这个过程,我的意思是“浏览用户输入信息的屏幕”。我不希望每一次可能的中断都要调用'rollback'。 – 2012-08-06 16:48:28

相关问题