我一直用这个虫子撞到墙上。基本上,关系不能正确地从一个上下文合并到另一个上下文。
假设我的模型中有两种实体类型,即学生和教师。一个学生只能有一个老师,一个老师显然可以有很多学生。我在我的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] == 0
但someStudentObject.teacher != nil
在backgroundContext
和持久存储(已验证)中正确设置了关系。只是不在uiContext
。
任何想法可能会发生什么?知道如何更好地调试这个吗?
答案 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
}
}];
}];