【发布时间】:2012-12-26 09:32:23
【问题描述】:
我的应用有时会在托管对象上下文中插入不一定要保存的对象。例如,当我启动“添加实体”模式时,我会创建一个托管对象并将其分配给该模式。如果用户从该模式保存,我保存上下文。如果他取消,我会删除该对象并且不需要保存。
我现在引入了一个“导入”功能,它可以切换到我的应用程序(使用 URL 方案)并添加一个实体。因为这些模态之一可能是打开的,所以此时保存上下文是不安全的。为模态创建的瞬态对象将被保存,即使用户取消,也不能保证稍后会保存删除(来自取消操作) - 用户可能会退出应用程序。
同样,我不能在我的应用退出时简单地保存。如果此时模态框处于打开状态,则临时对象将被错误地保存。
为了解决这个问题,我尝试使用子上下文,正如 here 所讨论的那样。在阅读了我在 SO 上能找到的所有内容后,我还有几个问题:
我应该为每个上下文使用哪种并发类型?请记住,我这样做不是为了性能/线程优势。我知道如果要拥有子上下文,我不能将 NSConfinementConcurrencyType 用于主上下文,但我不确定其他两个选项中的哪一个最适合。对于子上下文,是否需要匹配?或者我什至可以在这里使用禁闭类型吗?我尝试了多种组合,似乎一切正常,但我想知道哪种组合适合我的要求。
(附带问题)为什么我只能在使用 iVar 类时才能使用它?我认为我应该能够在创建它的方法中声明临时上下文,然后稍后使用 entity.managedObjectContext 引用它。但是当我来访问它时它似乎为零?如果我改为使用 iVar 来保存引用,则可以纠正此问题。
-
什么是正确的方法或将更改传播到主要上下文?我已经看到各种 cmets 在每个上下文中使用不同的块包装实现。这取决于我的并发类型吗?我目前的版本是:
//save the new entity in the temporary context NSError *error = nil; if (![myObject.managedObjectContext save:&error]) {NSLog(@"Error - unable to save new object in its (temporary) context");} //propogate the save to the main context [self.mainContext performBlock:^{ NSError *error2 = nil; if (![self.mainContext save:&error2]) {NSLog(@"Error - unable to merge new entity into main context");} }]; 当我的用户保存时,它会向其委托(我的主视图控制器)发送一条消息。委托传递了添加的对象,并且它必须在主上下文中找到相同的对象。但是当我在主要上下文中寻找它时,它没有找到。主要上下文确实包含实体 - 我可以记录其详细信息并确认它存在 - 但地址不同?如果这注定会发生(为什么?),我如何在保存后在主上下文中找到添加的对象?
感谢您的任何见解。抱歉,我提出了一个冗长的多部分问题,但我认为之前可能有人已经解决了所有这些问题。
【问题讨论】:
标签: ios objective-c cocoa core-data nsmanagedobjectcontext