我的应用程序有时会将对象插入到托管对象上下文中,这些对象不一定要保存。例如,当我启动“添加实体”模式时,我会创建一个托管对象并将其分配给该模式。如果用户从该模式保存,我保存上下文。如果他取消,我会删除该对象并且不需要保存。
我现在引入了一个“导入”功能,它可以切换到我的应用程序(使用 URL 方案)并添加一个实体。因为这些模态之一可能是打开的,所以此时保存上下文是不安全的。为模态创建的瞬态对象将被保存,即使用户取消,并且不能保证删除(来自取消操作)将被保存 - 用户可能会退出应用程序。
同样,我不能在我的应用退出时简单地保存。如果此时模态框处于打开状态,则临时对象将被错误地保存。
为了解决这个问题,我尝试使用子上下文,如此处所述。在阅读了我在 SO 上能找到的所有内容后,我还有几个问题:
我应该为每个上下文使用哪种并发类型?请记住,我这样做不是为了性能/线程优势。我知道如果要拥有子上下文,我不能将 NSConfinementConcurrencyType 用于主要上下文,但我不确定其他两个选项中的哪一个最适合。对于子上下文,是否需要匹配?或者我什至可以在这里使用禁闭类型吗?我尝试了多种组合,似乎一切正常,但我想知道哪种组合适合我的要求。
(附带问题)如果我使用类 iVar,为什么我只能让它工作?我认为我应该能够在创建它的方法中声明临时上下文,然后使用 entity.managedObjectContext 引用它。但是当我来访问它时它似乎为零?如果我改用 iVar 来保存参考,则可以纠正此问题。
什么是正确的方法或将更改传播到主要上下文?我已经看到在每个上下文中使用不同的块包装实现的各种评论。这取决于我的并发类型吗?我目前的版本是:
//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");} }];
当我的用户保存时,它会向其委托(我的主视图控制器)发送一条消息。委托传递了添加的对象,并且它必须在主上下文中找到相同的对象。但是当我在主要上下文中寻找它时,它没有找到。主要上下文确实包含实体 - 我可以记录其详细信息并确认它存在 - 但地址不同?如果这注定要发生(为什么?),我如何在保存后在主上下文中找到添加的对象?
感谢您的任何见解。对于一个冗长的多部分问题,我很抱歉,但我认为之前可能有人已经解决了所有这些问题。