我是Core Data的新手,我对如何以正确的方式做事情有一些疑问。我想我需要一个temporaryManagedObjectContext来处理临时实体,而用户正在编辑一个新实体。当用户点击保存该数据时,我想在persistedManagecObjectContext中插入这些实体,然后保存saveContext。实现这一目标的最佳做法是什么?由于我不想在临时环境中保存,因此必须使用线程?
感谢您的了解!
答案 0 :(得分:6)
您需要将临时ManagedObjectContext(MOC)中的更改合并到持久化的ManagedObjectContext中。这是我如何实现这一目标的一个例子。 我使用线程(每个线程一个MOC),但我很确定它应该没有线程也可以正常工作。
您可以调用此方法将更改保存在tempMOC中:
- (void) saveNewEntry {
NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
// Subscribe to "NSManagedObjectContextDidSaveNotification"
// ..which is sent when "[tempMOC save];" is called.
[dnc addObserver: self
selector: @selector(mergeChanges:)
name: NSManagedObjectContextDidSaveNotification
object: tempMOC];
// Save changes
[tempMOC save];
// Remove subscribtion
[dnc removeObserver: self
name: NSManagedObjectContextDidSaveNotification
object: tempMOC];
}
...将发出通知:
- (void) mergeChanges: (NSNotification*) saveNotification {
// If youre using threads, this is necessary:
[self performSelectorOnMainThread: @selector(mergeToMainContext:)
withObject: saveNotification
waitUntilDone: NO];
// ...otherwise, you could do the merge in this method
// [persistedMOC mergeChangesFromContextDidSaveNotification: saveNotification];
}
......反过来调用:
- (void) mergeToMainContext: (NSNotification*) saveNotification {
[persistedMOC mergeChangesFromContextDidSaveNotification: saveNotification];
}
答案 1 :(得分:0)
我有同样的问题(编辑需要一个对象,所以创建...但如果取消,扔掉那个对象)。不过,我最终采用了更强力的方法,正是为了避免所有多个对象上下文和合并:
我在所有对象中使用“is temp”字段。当我需要创建一个“临时”对象时,我在我的数据层中有一个方法可以正常创建一个对象,但是在返回之前翻转isTemp = true。
然后,在我的“对象编辑器”onCancel中有:
if (obj.isTemp) {
[context deleteObject: ... ];
}
onSave是:
if (obj.isTemp) obj.isTemp = NO;
[context saveAsUsual...];
注意:此处未解决的问题是,在用户确认保存之前,不会将“丢弃”更改复制到现有对象中。否则,当其他一些代码保存共享上下文时,更改将会像特洛伊木马一样等待应用。