我的应用使用嵌套的核心数据管理对象上下文。 父上下文位于主线程上。当我需要工作时,我在后台GCD串行队列上创建子上下文。
在这个子上下文中,我创建了一个新实体:LPProject
,它具有BOOL属性:valid
。
我在创建对象时将此属性设置为YES
。当我完成后,我保存孩子MOC以将这些更改推回到父上下文。
在主线程上,我有NSTreeController
为NSOutlineView
提供支持。这个TreeController绑定到我的主MOC并从那里获取其内容。
麻烦的是,只要我保存子 MOC,TreeController就会重新获取其内容(应该如此)但新的LPProject
实体的值是' valid
属性为NO
,应为YES
。
我已经添加了一堆日志记录语句,这就是我所看到的内容。 (注意:错误处理已被删除以简化。因为在保存子上下文之前获取新插入的managedObject的永久ID):
// Here, we are in a background GCD queue, working on the CHILD context.
NSLog(@"About to save child context. Project Valid?: %i, [newProject.valid boolValue]); // Result: Project IS valid.
[childContext save:NULL];
//
// RIGHT HERE is where the NSTreeController re-fetches and updates its content. See note below
//
NSLog(@"Saved child context. Project Valid?: %i", [newProject.valid boolValue]); // Result: Project IS valid.
NSManagedObjectID *projectID = [newProject.objectID retain];
dispatch_sync(dispatch_get_main_queue(),
^{
// self.managedObjectContext is the main-thread, parent context.
LPProject *affectedProject = (LPProject *)[self.managedObjectContext objectWithID:projectID];
NSLog(@"Back on main thread, project valid?: %i", [affectedProject.valid boolValue]); // Result: project IS valid.
LPProject
实体的valid
属性在我记录的所有点都是YES
。但是,当TreeController重新获取其内容时(在上面指出的位置发生),它会显示NO
valid
的新添加项目,即使该项目将显示YES
子上下文保存后的下一个NSLog语句。
这种情况发生随机,大约有50%的时间。我有点茫然无法解释或解决它。有什么想法吗?