4

我一直用这个虫子把头撞在墙上。基本上关系没有正确地从一个上下文合并到另一个上下文。

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

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

我还使用设置了一个嵌套结构[self.uiContext setParentContext:self.backgroundContext];

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

1) 从服务器获取教师

2)为他们创建托管对象backgroundContext

save 3 )调用backgroundContext

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

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

到目前为止,这工作得很好。我的 uiContext 获得了教师管理的对象,我的 UI 也相应地更新。

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

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

6)为他们创建托管对象,backgroundContext设置从学生到适当老师的关系。

save 7 )打电话backgroundContext

8)因为我正在收听NSManagedObjectContextDidSaveNotification通知,所以这个保存应该合并到uiContext

但是,这是我开始遇到问题的地方。即使学生对象被uiContext正确地合并到了,教师与学生之间的关系并没有被设置。从学生到老师的关系是正确设置的,但不是相反。具体来说,[someTeacherObject.students count] == 0但是someStudentObject.teacher != nil

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

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

4

1 回答 1

0

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

有关更多信息,请参阅本文关于多上下文核心数据的“父/子上下文”部分。

编辑

取自那篇文章,代码如下所示:

[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
        }
    }];
}];
于 2013-01-20T10:15:21.107 回答