Objective c MagicalRecord:立即创建,(可能)稍后保存
最近我一直在使用MagicalRecord——天哪,它让我的核心数据生活变得越来越轻松,这完全归功于《什么是优质库》的作者 无论如何,场景是我有3个控制器组成的导航控制器堆栈,这里从下到上称为A-B-C: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]在
- 视图控制器A是一个表单,我想在其中填写有关实体(即其属性)的详细信息李>
- 视图控制器B显示实体的计算结果(例如,通过实例函数)李>
- 为了简单起见,视图控制器C只是一个确认&这是我想要保存实体的地方
[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都被保存了。然而,你会因为有了正确的想法而获得一张赞成票。