MagicalRecord:现在创建,(可能)稍后保存

Posted

技术标签:

【中文标题】MagicalRecord:现在创建,(可能)稍后保存【英文标题】:MagicalRecord: Create now, (possibly) save later 【发布时间】:2012-11-29 22:42:46 【问题描述】:

我最近一直在使用 MagicalRecord - 天哪,它让我的 Core Data 生活变得更加轻松,因此完全归功于质量库的作者!

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

视图控制器 A 是一个表单,我想在其中填写有关实体的详细信息(即其属性)。 视图控制器 B 显示来自实体的计算结果(例如,通过实例函数)。 为简单起见,视图控制器 C 只是一个确认 & 是我要保存实体的位置。

MagicalRecord 中是否有办法我可以在视图控制器 A 中调用 [MyEntity createEntity] 并设置其属性,然后通过 B 将其传递给 C 并且 将其保存在 C 中?如果用户决定从 B 或 C 返回到 A,这还包括根本不保存它的可能性。

我完全明白我很可能在使用 Core Data 时遇到了错误,这可能是不可能的。作为一种解决方法,我已经知道我可以创建一个类方法,在给定相关参数的情况下执行相同的计算并将所有参数通过堆栈从 A 传递到 C。

编辑:为了清楚起见,我想在 View Controller C 中调用 [[NSManagedObjectContext defaultContext] save]

【问题讨论】:

【参考方案1】:

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

无论如何,VC 都应该在主线程上运行。所以所有人都可以使用

[NSManagedObjectContext defaultContext]

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

@property NSManagedObjectContext *context;

【讨论】:

这很好,但不幸的是这不是正确的答案。如果我在 View Controller A 中创建了一个实体(标记为 p),则到 B 中查看实例方法上的计算结果。然后我决定返回 A 并创建另一个新实体(标记为 q),通过 B 到达 C,我在此调用 [[NSManagedObjectContext defaultContext] save]。如果我经历那个场景,不幸的是 both p & q 被保存了。但是,您确实会因为有正确的想法而获得支持。【参考方案2】:

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

但是,我的测试表明我需要做更多工作以避免保存任何不需要的实体。我注意到如果我通过后退按钮从 B 转到 A,我想丢弃那里的实体。在我的用例中,我是否只是创建另一个从 A 到 B 的新实体并不重要,如果我成功保存了实体,我永远不会通过 View Controller B 返回。

因此,如果在视图控制器 B 上按下后退按钮,基本上我需要删除未保存的实体。This answer 在那里极大地帮助了我,导致视图控制器 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];

【讨论】:

以上是关于MagicalRecord:现在创建,(可能)稍后保存的主要内容,如果未能解决你的问题,请参考以下文章

是否可以创建一个可以稍后下载插件和扩展的 IOS 应用程序?

MagicalRecord saveWithBlock 用法现在无法在 XCode 7 beta 5 下编译

在稍后阶段保存上下文 - 保存指向上下文的指针?核心数据

Magical Record 似乎可以保存,但如果应用程序终止,更改会丢失

使用 MagicalRecord 使用当前实体创建新实体

神奇的记录导入数据和关系