【发布时间】:2011-11-18 00:23:42
【问题描述】:
是否可以在保存发生后找出托管对象上保存了哪些属性?例如,我有人在监听托管对象上下文保存 (NSManagedObjectContextDidSaveNotification),我想知道保存了对象上的哪些属性。
【问题讨论】:
标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext
是否可以在保存发生后找出托管对象上保存了哪些属性?例如,我有人在监听托管对象上下文保存 (NSManagedObjectContextDidSaveNotification),我想知道保存了对象上的哪些属性。
【问题讨论】:
标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext
NSManagedObjectContextDidSaveNotification 确实包含与服务器同步所需的全部三个信息。查看[notification userInfo],你会发现里面有三组:NSInsertedObjectsKey、NSUpdatedObjectsKey和NSDeletedObjectsKey
如果您想知道实体上的哪些属性已更改,则需要您自己使用 KVO 跟踪它们。我建议不要这样做,因为与将整个对象推送到服务器相比,付出这种努力的可能性很小。
进一步探索:
您可以从NSManagedObjectContextWillSaveNotification 循环遍历每个集合并引用changedValues 方法。在收到NSManagedObjectContextDidSaveNotification 之前,您可以保留对该字典的引用,然后处理更改。对我来说听起来仍然很沉重。
你的最终目标是什么?!?!
如果您试图弄清楚要推送到服务器的内容,那么处于属性级别太低了。您应该在实体级别进行同步。
如果您只是想在应用程序内部保持一些内部一致性,那么您的想法太低级了。这是一个已解决的问题。 Core Data 解决了它。
【讨论】:
当他们即将被拯救时,你为什么不把它们拿走。订阅 NSManagedObjectContextWillSaveNotification 并检查NSManagedObjectContext 的insertedObjects、updatedObjects 和deletedObjects。
更新:
更简单,获取NSManagedObjectContextDidSaveNotification的用户信息
来自文档:
通常,在线程 A 上,您为托管对象上下文注册 保存通知,NSManagedObjectContextDidSaveNotification。当你 收到通知,其用户信息字典包含数组 插入、删除和更新的托管对象 线程 B。
【讨论】:
这是我解决的解决方案。我有一个单例类,当上下文保存时会收到通知。 NSManagedObjectContextWillSave 通知告诉我哪些事情发生了变化,所以我将它们存储在字典中,键是保存的上下文。然后,当我收到 NSManagedObjectContextDidSave 通知时,我会检查字典中的关联上下文。最后,我从字典中删除了该条目。这看起来合理吗?
【讨论】: