当我在后台更新此对象(私有队列并发类型)上下文,然后将保存的更改合并到主队列上下文(在mergeChangesFromContextDidSaveNotification中)时,KVO通知将按预期方式触发.
但是,我预计通知只会针对实际更改的关键路径启动,而不是针对NSManagedObject的所有关键字.即使没有改变,我正在收到KVO通知给对方的每个关键字.
这是设计还是我做错了?
在苹果文档中看不到任何东西….
解决方法
处理问题的最简单的方法(好的,在“重新显示所有保存的所有内容之后,最简单的”,我发现一个优秀的第一个通过选项,直到有人抱怨)是监听通用保存通知,然后在每个更新的对象上调用-changedValues来选择您有兴趣触发具体更新的那些.
如果对您的用例来说,这绝对无效率,您可以使自定义访问器(mogenerator对此有很大的帮助),用于在编辑线程标记上收集的属性,以便更改所有您感兴趣的属性;并将其作为保存后的通知发送.
例如说我们有a professional sports team app是不断更新,在后台解析的JSON Feed.各种团队,玩家,游戏等的所有显示影响属性.NSManagedObjects具有自定义访问器,在{playerStatsChanged,teamStatsChanged,leagueRankingsChanged,yadayadayadaChanged}的结构中设置标志,对应于应用程序中的哪些页面需要在当前提取后重新显示和解析线程完成.一旦它被保存,它将触发通过该标志设置结构的通用“更新这些屏幕”通知.在任何情况下,您可能将个别变更路径通知合并到某个更高级别的“更新此屏幕”类型逻辑,对吗?那么,对于大多数合理的用例来说,在属性设置级别上,几乎是最低的开销点.当然,对于任何反复提取的更新设计,如我们的运动队应用程序在这里.