【问题标题】:NSManagedObject changed properties after saveNSManagedObject 保存后更改了属性
【发布时间】:2011-11-18 00:23:42
【问题描述】:

是否可以在保存发生后找出托管对象上保存了哪些属性?例如,我有人在监听托管对象上下文保存 (NSManagedObjectContextDidSaveNotification),我想知道保存了对象上的哪些属性。

【问题讨论】:

    标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext


    【解决方案1】:

    NSManagedObjectContextDidSaveNotification 确实包含与服务器同步所需的全部三个信息。查看[notification userInfo],你会发现里面有三组:NSInsertedObjectsKeyNSUpdatedObjectsKeyNSDeletedObjectsKey

    如果您想知道实体上的哪些属性已更改,则需要您自己使用 KVO 跟踪它们。我建议不要这样做,因为与将整个对象推送到服务器相比,付出这种努力的可能性很小。

    更新 #2

    进一步探索:

    您可以从NSManagedObjectContextWillSaveNotification 循环遍历每个集合并引用changedValues 方法。在收到NSManagedObjectContextDidSaveNotification 之前,您可以保留对该字典的引用,然后处理更改。对我来说听起来仍然很沉重。

    更新

    你的最终目标是什么?!?!

    如果您试图弄清楚要推送到服务器的内容,那么处于属性级别太低了。您应该在实体级别进行同步。

    如果您只是想在应用程序内部保持一些内部一致性,那么您的想法太低级了。这是一个已解决的问题。 Core Data 解决了它。

    【讨论】:

    • 我会知道哪些对象被更新、删除或插入,但不知道哪些具体属性
    • 正确。您将能够确定哪些对象,但 Core Data 不会公开对象上的哪些属性已更改。答案已更新。
    • 我真正感兴趣的是哪些属性发生了变化
    • 我认为您必须缓存活动对象以与插入/更新/删除进行比较,或者使用 keyValueObserving (我还没有这样做,但我认为这是它的经典案例)。
    • 正确@Wienke,正如我在答案更新中提到的那样;您需要在每个实体的每个实例上实现 KVO,并跟踪该级别的更改。这很可能是个坏主意,不值得付出努力。
    【解决方案2】:

    当他们即将被拯救时,你为什么不把它们拿走。订阅 NSManagedObjectContextWillSaveNotification 并检查NSManagedObjectContextinsertedObjectsupdatedObjectsdeletedObjects

    更新:

    更简单,获取NSManagedObjectContextDidSaveNotification的用户信息

    来自文档:

    通常,在线程 A 上,您为托管对象上下文注册 保存通知,NSManagedObjectContextDidSaveNotification。当你 收到通知,其用户信息字典包含数组 插入、删除和更新的托管对象 线程 B。

    http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/coredata/Articles/cdConcurrency.html#//apple_ref/doc/uid/TP40003385-SW1

    【讨论】:

    • 因为如果我需要做一些涉及从另一个线程上的数据库获取的事情怎么办?该值尚未持久化
    • @Marcus S. Zarra:我指的是 NSManagedObjectContex 的方法,而不是 NSManagedObjectContextWillSaveNotification 的用户信息
    【解决方案3】:

    这是我解决的解决方案。我有一个单例类,当上下文保存时会收到通知。 NSManagedObjectContextWillSave 通知告诉我哪些事情发生了变化,所以我将它们存储在字典中,键是保存的上下文。然后,当我收到 NSManagedObjectContextDidSave 通知时,我会检查字典中的关联上下文。最后,我从字典中删除了该条目。这看起来合理吗?

    【讨论】:

    • 看我的答案,因为你的最终目标决定了答案。我怀疑你想太多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多