我需要创建NSManagedObject实例,用它们做一些事情,然后将它们丢弃或存储到sqlite db.问题是,我无法创建NSManagedObject未连接的实例,NSManagedObjectContext这意味着在我决定不需要我的数据库中的某些对象后,我必须以某种方式清理.
为了解决这个问题,我使用相同的协调器创建了一个内存存储,并且我使用assignObject:toPersistentStore.Now 将临时对象放在那里,如何确保这些临时对象无法获取数据,我从中获取数据两个商店的上下文共同点?或者我是否必须为此类任务创建单独的上下文?
现在我正在考虑为内存存储创建单独的上下文.如何将对象从一个上下文移动到另一个上下文?只是使用[context insertObject:]?它在这个设置中可以正常工作吗?如果我从对象图中插入一个对象,整个图形是否也会插入到上下文中?
我的应用程序有时会将对象插入到托管对象上下文中,而这些对象并不一定要保存.例如,当我启动"添加实体"模式时,我创建了一个托管对象并将其分配给模态.如果用户从该模态中保存,我将保存上下文.如果他取消,我删除该对象,不需要保存.
我现在已经引入了一个"导入"功能,切换到我的应用程序(使用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");}
}];
Run Code Online (Sandbox Code Playgroud)当我的用户保存时,它会向其委托(我的主视图控制器)发送一条消息.委托传递添加的对象,它必须在主上下文中找到相同的对象.但是当我在主要环境中寻找它时,却找不到它.主要上下文确实包含实体 - 我可以记录它的详细信息并确认它在那里 - 但地址是不同的?如果这意味着发生(为什么?),如何在保存后在主上下文中找到添加的对象?
感谢您的任何见解.很抱歉有一个很长的,多部分的问题,但我认为有人可能已经解决过所有这些问题.