核心数据和托管对象上下文

时间:2011-12-16 23:47:15

标签: ios core-data nsmanagedobjectcontext

我是Core Data的新手,我对如何以正确的方式做事情有一些疑问。我想我需要一个temporaryManagedObjectContext来处理临时实体,而用户正在编辑一个新实体。当用户点击保存该数据时,我想在persistedManagecObjectContext中插入这些实体,然后保存saveContext。实现这一目标的最佳做法是什么?由于我不想在临时环境中保存,因此必须使用线程?

感谢您的了解!

2 个答案:

答案 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...];

注意:此处未解决的问题是,在用户确认保存之前,不会将“丢弃”更改复制到现有对象中。否则,当其他一些代码保存共享上下文时,更改将会像特洛伊木马一样等待应用。