Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c MagicalRecord:立即创建,(可能)稍后保存_Objective C_Ios_Macos_Core Data_Magicalrecord - Fatal编程技术网

Objective c MagicalRecord:立即创建,(可能)稍后保存

Objective c MagicalRecord:立即创建,(可能)稍后保存,objective-c,ios,macos,core-data,magicalrecord,Objective C,Ios,Macos,Core Data,Magicalrecord,最近我一直在使用MagicalRecord——天哪,它让我的核心数据生活变得越来越轻松,这完全归功于《什么是优质库》的作者 无论如何,场景是我有3个控制器组成的导航控制器堆栈,这里从下到上称为A-B-C: 视图控制器A是一个表单,我想在其中填写有关实体(即其属性)的详细信息 视图控制器B显示实体的计算结果(例如,通过实例函数) 为了简单起见,视图控制器C只是一个确认&这是我想要保存实体的地方 在MagicalRecord中是否有一种方法可以调用[MyEntity createEntity]在

最近我一直在使用MagicalRecord——天哪,它让我的核心数据生活变得越来越轻松,这完全归功于《什么是优质库》的作者

无论如何,场景是我有3个控制器组成的导航控制器堆栈,这里从下到上称为A-B-C:

  • 视图控制器A是一个表单,我想在其中填写有关实体(即其属性)的详细信息
  • 视图控制器B显示实体的计算结果(例如,通过实例函数)
  • 为了简单起见,视图控制器C只是一个确认&这是我想要保存实体的地方
在MagicalRecord中是否有一种方法可以调用
[MyEntity createEntity]
在视图控制器a中设置其属性,通过B将其传递给C&仅将其保存在C中?这还包括如果用户决定从B或C返回A,则根本不保存它的可能性

我完全理解,我可能在核心数据方面走错了方向&这可能是不可能的。作为一种解决方法,我已经知道我可以创建一个类方法,在给定相关参数的情况下执行相同的计算&通过堆栈将所有参数从a传递到C


编辑:为了清楚起见,我想在视图控制器C中调用
[[NSManagedObjectContext defaultContext]save]

是的,当然。。只是不要保存managedContext

无论如何,VCs都应该在主线程上运行。。所以大家都可以用

[NSManagedObjectContext defaultContext]

使用控制器上的属性在三个类之间传递MOC

@property NSManagedObjectContext *context;

经过一些测试,我知道@Daij Djan的想法是正确的,如果我不想保存我的实体,我不会调用
[[NSManagedObjectContext defaultContext]save]
。因此,我将该调用保留到视图控制器C进行保存

然而,我的测试表明我需要做更多的工作来避免保存任何不需要的实体。我注意到如果我通过后退按钮从B转到A,我想放弃那里的实体。在我的用例中,如果我只是创建另一个从A到B的新实体并不重要,如果我成功保存了实体,我就不会通过视图控制器B返回

因此,如果按下视图控制器B上的“后退”按钮,基本上我需要删除未保存的实体。这在很大程度上帮助了我,导致视图控制器B中出现以下代码:

-(void) viewWillDisappear:(BOOL)animated {
    if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) {
        // self.entity is the instance of my entity

        [self.entity deleteEntity];
        self.entity = nil;
    }
    [super viewWillDisappear:animated];
}

这很好,但不幸的是,这不是正确的答案。如果我在视图控制器A中创建了一个实体(标记为p),请转到B以查看实例方法的计算结果。然后我决定返回A&创建另一个新实体(标记为q),通过B进入C,在那里我调用
[[NSManagedObjectContext defaultContext]save]
。如果我经历这种情况,不幸的是p&q都被保存了。然而,你会因为有了正确的想法而获得一张赞成票。