核心数据:保存嵌套MOC时,NSManagedObject属性会发生短暂变化

时间:2015-09-29 04:08:43

标签: objective-c cocoa core-data nsmanagedobject nsmanagedobjectcontext

设置

我的应用使用嵌套的核心数据管理对象上下文。 上下文位于主线程上。当我需要工作时,我在后台GCD串行队列上创建上下文。

在这个子上下文中,我创建了一个新实体:LPProject,它具有BOOL属性:valid

我在创建对象时将此属性设置为YES。当我完成后,我保存孩子MOC以将这些更改推回到父上下文。

问题

在主线程上,我有NSTreeControllerNSOutlineView提供支持。这个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.

WTF?

LPProject实体的valid属性在我记录的所有点都是YES。但是,当TreeController重新获取其内容时(在上面指出的位置发生),它会显示NO valid的新添加项目,即使该项目将显示YES子上下文保存后的下一个NSLog语句。

这种情况发生随机,大​​约有50%的时间。我有点茫然无法解释或解决它。有什么想法吗?

0 个答案:

没有答案