CoreData关系不是从一个MOC合并到另一个MOC

时间:2013-01-18 18:38:00

标签: ios core-data merge relationship nsmanagedobjectcontext

我一直用这个虫子撞到墙上。基本上,关系不能正确地从一个上下文合并到另一个上下文。

假设我的模型中有两种实体类型,即学生和教师。一个学生只能有一个老师,一个老师显然可以有很多学生。我在我的xcdatamodel类中正确设置了它。

因为我正在从服务器同步这些实体,所以我有2个托管对象上下文 - 一个名为uiContext,其并发类型设置为NSMainQueueConcurrencyType,另一个名为backgroundContext并发类型设置为NSPrivateQueueConcurrencyType

我还使用[self.uiContext setParentContext:self.backgroundContext];

设置了嵌套结构

所以这就是我正在做的事情:

1)从服务器获取教师

2)在backgroundContext

中为他们创建托管对象

3)在save

上致电backgroundContext

4)我在监听NSManagedObjectContextDidSaveNotification,并执行以下代码:

[self.uiContext performBlock:^(void) {
   [self.uiContext mergeChangesFromContextDidSaveNotification:notif];
}];

到目前为止,这项工作正常。我的uiContext相应地获取了教师管理对象和我的UI更新。

当我执行以下操作时,它会崩溃:

5)从服务器获取学生数据

6)在backgroundContext中为他们创建托管对象,设置从学生到相应教师的关系。

7)在save

上致电backgroundContext

8)由于我正在收听NSManagedObjectContextDidSaveNotification通知,因此此保存应合并到uiContext

然而,在这里,我开始遇到问题。即使学生对象正确地合并到uiContext,也没有设置从教师到学生的关系。从学生到教师的关系是正确设定的,但不是相反。具体而言,[someTeacherObject.students count] == 0someStudentObject.teacher != nil

backgroundContext和持久存储(已验证)中正确设置了关系。只是不在uiContext

任何想法可能会发生什么?知道如何更好地调试这个吗?

1 个答案:

答案 0 :(得分:0)

据我所知,一旦为背景上下文设置了parentContext,就不再需要监听更改并手动合并它们。但是,您需要在主上下文中执行额外的saveContext:以将更改保存到商店。

查看“家长/儿童语境”'有关详细信息,请参阅此article on multi-context Core Data部分。

修改

从该文章中得出的代码如下:

[backgroundContext performBlock:^{
// do something that takes some time asynchronously using the bg context

   // push to parent
   NSError *error;
   if (![backgroundContext save:&error])
   {
       // handle error
   }

   // save parent to disk asynchronously
   [mainMOC performBlock:^{
        NSError *error;
        if (![mainMOC save:&error])
        {
           // handle error
        }
    }];
}];