有没有更好的方法:我使用AddingManagedObjectContext?

时间:2012-07-09 16:19:07

标签: core-data nsmanagedobjectcontext

问题:使用AddingManagedObjectContext?

的kludgy

该应用程序是Universal Library Style CoreData。 RootTableView有书籍类别列表,小说,科幻等。 通过EditButton在第二级BookListTableView上添加书籍,然后在新出现的“+”按钮上完成。第三级显示书籍详细信息表视图。

当用户触摸第二级“BookList”视图中的“+”按钮时,他有 已经表明该书应该默认具有刚才选择的类别 主页BookCategoryList视图。新书将是主MOC中未知的对象,并在插入操作开始时放在addsMOC中。我发现如果我添加了 用户所需的类别,比如Sci-Fi,从mainMOC到addMOC,有一个 保存时出错:时间,因为据我所知,ManagedObject不能存在于两个不同的MOC中。

因为为了方便用户,我想进行这个类别的添加,所以我会经历 以下工作。我使用相同的新替代类别 类别名称,并将其添加到新书的属性:

@property (nonatomic, retain) NSSet* categories;

,从而允许编辑模式下的“书籍详细信息表”视图显示替代类别对象的名称。然后当用户触摸Save按钮时,就在:

之前
[self.addingManagedObjectContext save:&error]

使用objectID,我从新书中删除替代类别,然后删除它  来自AddingManagedObjectContext本身。

关注此addMOC保存:

NSNotificationCenter * dnc = [NSNotificationCenter defaultCenter];          [dnc addObserver:self selector:@selector(addControllerContextDidSave :) name:NSManagedObjectContextDidSaveNotification对象:             self.addingManagedObjectContext];

addMOC中的新书(无类别)合并到mainMOC

然后我将mainMOC的相应类别插入到新书中 然后保存mainMOC以完成saveAction。

这适合我,但感觉很尴尬。有人可以解释我错在哪里 而我错过了什么?什么是正确和优雅的可可方式来处理这个问题?

谢谢,Mark

1 个答案:

答案 0 :(得分:1)

托管对象可以存在于多个托管对象上下文中,或者更精确地表示给定实体的同一实例的托管对象可以存在于多个上下文中。

当您将托管对象实例从一个上下文直接传递到另一个上下文时会出现问题,尤其是在您找到的跨越线程边界时。

“传递”托管对象的正确方法是传递objectId,例如

//Context 1
NSManagedObjectID *objectID = myObjectInContext1.objectID;

//Context 2
NSManagedObject *myObjectInContext2 = [self.managedObjectContext2 objectWithID:objectID];

或者,您也可以在第二个上下文中从持久性存储中重新获取类别,这将为您提供有效的类别对象,然后传递一些其他值以指示要使用哪些对象,例如:类别ID或标题。