mergeChangesFromContextDidSaveNotification之后的KVO通知

我正在使用KVO观察NSManagedObject上的更改。 我正在观察的NSManagedObject是主队列上的一个NSManagedObject上下文的一部分。

当我在后台 (专用队列并发types)上下文中更新此对象,然后将保存的更改合并到我的主队列上下文(在mergeChangesFromContextDidSaveNotification中)时,KVO通知将按预期启动。

不过,我期望通知只会触发实际更改的关键path,而不是 NSManagedObject的所有关键path。 即使没有更改,我也会收到我的对象的每个键path的KVO通知。

这是由devise还是我做错了什么?

在苹果文档中看不到任何内容….

这是没有logging,但在OS X和iOS上观察到的行为,保存计数作为整个NSManagedObject的变化不仅仅是不同的元素。 你可以find围绕着这个网站,openradar.appspot.com等等的绑定等等的各种后果的抱怨。这个问题也performance出明显虚假的KVO解雇是完全不足为奇的。

最简单的方法来处理这个问题(好吧,最简单的'重新显示保存',我发现一个很好的第一遍选项,直到有人抱怨之后)是听通用的保存通知,然后调用每个更新的对象上的-changedValuesselect你有兴趣发射特定的更新。

如果这对你的用例来说效率不高,你可以为你的属性定制访问器(mogenerator对此很有帮助),这些属性在编辑线程标志上收集你感兴趣的所有属性的更改; 并保存后作为通知发送。

让我们举例说,我们有一个专业的运动队应用程序 ,不断更新,在后台parsing的JSON提要。 影响各种团队,玩家,游戏等的所有影响显示的属性。NSManagedObjects具有自定义访问器,用于在{playerStatsChanged,teamStatsChanged,leagueRankingsChanged,yadayadayadaChanged}的结构中设置标志,对应于当前获取的应用程序中的哪些页面需要重新显示并且分析线程完成。 然后,一旦它被保存,它会触发一个通用的“更新这些屏幕”通知与该标志设置结构。 无论如何,您可能会将各个变更path通知合并到更高级别的“更新此屏幕”types逻辑中,对吗? 那么,对于大多数合理的用例来说,属性setter级别几乎是最低的开销点。 当然对于任何经常性的提取更新devise,如我们的运动队应用程序在这里。

您可以使用手动通知覆盖自动更改通知,仅针对您select的按键。 在这里检查详细的文件。