我一直用这个虫子把头撞在墙上。基本上关系没有正确地从一个上下文合并到另一个上下文。
假设我的模型中有两种实体类型,学生和教师。一个学生只能有一个老师,一个老师显然可以有很多学生。我在我的 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
.
任何想法可能会发生什么?知道如何更好地调试吗?