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

Posted

技术标签:

【中文标题】核心数据和托管对象上下文【英文标题】:Core Data and Managed Object Contexts 【发布时间】:2011-12-16 23:47:14 【问题描述】:

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

感谢您的知识!

【问题讨论】:

我没有时间写一个完整的答案,但你可以尝试使用这里描述的多上下文核心日期cocoanetics.com/2012/07/multi-context-coredata 【参考方案1】:

您需要将临时 ManagedObjectContext (MOC) 中的更改合并到持久化中。这是我如何实现这一目标的一个例子。 我使用线程(每个线程一个 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];


【讨论】:

【参考方案2】:

我有同样的问题(编辑器需要一个对象,所以创建......但如果取消,扔掉那个对象)。不过,我最终采用了一种更暴力的方法,正是为了避免所有多个对象上下文和合并:

我在所有对象中都使用了“is temp”字段。当我需要创建一个“临时”对象时,我的数据层中有一个方法可以正常创建一个对象,然后在返回之前翻转 isTemp=true。

然后,在我的“对象编辑器”onCancel 中有:

if (obj.isTemp) 
    [context deleteObject: ... ];

onSave 是:

if (obj.isTemp)  obj.isTemp = NO;
[context saveAsUsual...];

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

【讨论】:

以上是关于核心数据和托管对象上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何在托管对象上下文之外使用核心数据对象?

核心数据单一托管对象上下文和两个线程

核心数据:我的托管对象上的托管对象上下文为零

核心数据:父/子托管对象上下文是不是适合更新一组多个对象?

核心数据获取...为啥在将托管对象插入上下文 A 并保存上下文 A 后,不使用上下文 B 获取托管对象?

iPhone - 核心数据崩溃 - 多个托管对象上下文