微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 合并之后的KVO通知.ChangesFromContextDidSaveNotification

我正在使用KVO来观察NSManagedobject的变化.正在观察的NSManagedobject是主队列上的NSManagedobject上下文的一部分.

当我在后台更新此对象(私有队列并发类型)上下文,然后将保存的更改合并到主队列上下文(在mergeChangesFromContextDidSaveNotification中)时,KVO通知将按预期方式触发.

但是,我预计通知只会针对实际更改的关键路径启动,而不是针对NSManagedobject的所有关键字.即使没有改变,我正在收到KVO通知给对方的每个关键字.

这是设计还是我做错了?

在苹果文档中看不到任何东西….

解决方法

在OS X和iOS上,这是一个没有记录但观察到的行为,一个保存计数是对整个NSManagedobject的改变,而不仅仅是不同的元素.您可以在openradar.appspot.com等网站上找到关于这个网站上的绑定等的各种后果的抱怨.这个问题也表现为明显的KVO触发是完全没有意思的.

处理问题的最简单的方法(好的,在“重新显示所有保存的所有内容之后,最简单的”,我发现一个优秀的第一个通过选项,直到有人抱怨)是监听通用保存通知,然后在每个更新的对象上调用-changedValues来选择您有兴趣触发具体更新的那些.

如果对您的用例来说,这绝对无效率,您可以使自定义访问器(mogenerator对此有很大的帮助),用于在编辑线程标记上收集的属性,以便更改所有您感兴趣的属性;并将其作为保存后的通知发送.

例如说我们有a professional sports team app是不断更新,在后台解析的JSON Feed.各种团队,玩家,游戏等的所有显示影响属性.NSManagedobjects具有自定义访问器,在{playerStatsChanged,teamStatsChanged,leagueRankingsChanged,yadayadayadaChanged}的结构中设置标志,对应于应用程序中的哪些页面需要在当前提取后重新显示和解析线程完成.一旦它被保存,它将触发通过该标志设置结构的通用“更新这些屏幕”通知.在任何情况下,您可能将个别变更路径通知合并到某个更高级别的“更新此屏幕”类型逻辑,对吗?那么,对于大多数合理的用例来说,在属性设置级别上,几乎是最低的开销点.当然,对于任何反复提取的更新设计,如我们的运动队应用程序在这里.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐