0

问题:AddingManagedObjectContext 的笨拙使用?

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

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

因为我想为了方便用户而执行此类别添加,所以我进行了以下工作。我使用具有相同类别名称的新替代类别,并将其添加到新书的属性中:

@property (nonatomic, retain) NSSet* categories;

,从而允许在编辑模式下的 Books Details Table 视图显示替代类别对象的名称。然后当用户触摸保存按钮时,就在:

[self.addingManagedObjectContext save:&error]

使用objectID,我从新书中删除了替代类别,然后从addingManagedObjectContext 本身中删除了相同类别。

按照这个添加MOC保存通过:

NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter]; [dnc addObserver:self 选择器:@selector(addControllerContextDidSave:) 名称:NSManagedObjectContextDidSaveNotification 对象:self.addingManagedObjectContext];

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

然后我将mainMOC对应的category插入到新书里,然后保存mainMOC,完成saveAction。

这对我有用,但感觉很尴尬。有人可以解释我错在哪里以及我错过了什么吗?处理这个问题的正确和优雅的可可方法是什么?

谢谢,马克

4

1 回答 1

1

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

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

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

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

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

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

于 2012-07-09T22:32:09.087 回答