2011-12-16 80 views
3

我是Core Data的新成员,我对如何以正确的方式完成这些任务有一些疑问。我想我需要一个temporaryManagedObjectContext来处理临时实体,而用户正在编辑一个新的实体。当用户点击保存那些数据时,我想将这些实体插入到persistedManagecObjectContext然后saveContext。达到此目的的最佳做法是什么?由于我不想保存在临时上下文中,因此使用线程是强制性的?核心数据和托管对象上下文

谢谢你的知识!

+0

我没有时间来写一个完整的答案,但这里http://www.cocoanetics.com/2012/07/multi-context-coredata/ – Abizern 2013-06-10 14:47:13

回答

6

您需要将临时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]; 

} 
+0

这说明你可以尝试使用多情境核心日期作品!谢谢你,你救了我的一天! – Samui 2011-12-17 01:38:07

0

我有同样的问题(编辑器需要一个对象,所以创建...但如果取消,扔掉那个对象)。我结束了一个更强力的办法,不过,正是为了避免所有多个客体环境和合并:

我在所有对象使用“是临时”字段。当我需要建立一个“临时”的对象我有我的数据层的方法是创建一个对象正常,但随后在返回前翻转isTemp =真。

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

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

的onSave是:

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

注:没有解决这里有没有抄袭 “扔掉” 改变成问题直到用户确认保存为止的现有对象。否则,改变会坐在那里,像一个木马等待时,一些其他的代码保存共享方面得到应用。