2012-07-09 37 views
0

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

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

当用户触摸第二级“书目”视图中的“+”按钮,他已经 已经指出,这本书应该有预设刚上 家BookCategoryList视图中选择的类别。新书将成为主MOC中未知的对象,并在插入操作开始时放置在添加MOC中。我发现,如果我将用户所需的类别(例如Sci-Fi)从主MOC添加到添加MOC中,则在保存时会出现 错误,因为据我所知,ManagedObject不能存在于两个不同的MOC中。

因为我想为了方便用户执行这个类别添加,所以我通过 下面的工作。我用同样的 类别名称的新替身类别,并增加了新的图书的财产:

@property (nonatomic, retain) NSSet* categories; 

,从而允许在编辑模式下的图书详细信息表视图来显示待机动名在类别对象中。然后,当用户触摸保存按钮,只是之前:

[self.addingManagedObjectContext save:&error] 

使用的objectID的,我取出待用从新书类别,然后从addingManagedObjectContext去掉自己一样 。

按照此addingMOC节省经由:

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

新书(不分类)的addingMOC合并到mainMOC

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

这适用于我,但它感觉尴尬。有人可以解释我错在哪里 和我失踪了吗?什么是正确和优雅的可可方式来处理这个问题?

谢谢,马克

回答

1

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

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

“传递”管理对象的正确方法是通过objectId而不是例如

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

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

或者你也可以从第二上下文中的持久性存储,它会给你有效的类别对象重新获取的类别,然后通过一些其他的值表示要使用的这些对象的例如类别ID或标题。

+0

非常感谢。 – mbarron 2012-07-10 03:17:21

+0

再次感谢。我刚刚删除了许多无用和混淆的代码。我很高兴有专家像你愿意伸出援助之手。 – mbarron 2012-07-10 14:39:54

+0

如果我是专家,我们都注定要失败!我刚刚阅读了太多的核心数据资料,试图让我的头脑完整。很高兴能够提供帮助,我从堆栈溢出中获得了很多帮助。 – 2012-07-10 15:23:07

相关问题