实现此类目标的正确方法是使用新的托管对象上下文。使用相同的持久性存储创建托管对象上下文:
NSManagedObjectContext *tempContext = [[[NSManagedObjectContext alloc] init] autorelease];
[tempContext setPersistentStore:[originalContext persistentStore]];
然后,添加新对象,对其进行突变等。
当需要保存时,您需要在tempContext上调用[tempContext save:...],并处理save通知以将其合并到原始上下文中。要丢弃这些对象,只需释放此临时上下文并忽略它即可。
因此,当您保存临时上下文时,所做的更改将保存到存储中,而您只需要将这些更改返回到主上下文中即可:
- (void)tempContextSaved:(NSNotification *)notification {
[originalContext mergeChangesFromContextDidSaveNotification:notification];
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(tempContextSaved:)
name:NSManagedObjectContextDidSaveNotification
object:tempContext];
[tempContext save:NULL];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSManagedObjectContextDidSaveNotification
object:tempContext];
这也是您应该处理多线程核心数据操作的方式。每个线程一个上下文。
如果您需要从此临时上下文访问现有对象(以添加关系等),则需要使用对象的ID来获取新的实例,如下所示:
NSManagedObject *objectInOriginalContext = ...;
NSManagedObject *objectInTemporaryContext = [tempContext objectWithID:[objectInOriginalContext objectID]];
如果您尝试NSManagedObject
在错误的上下文中使用,则保存时会出现异常。