Ios 基本设置器和NSManagedObjectContext通知

Ios 基本设置器和NSManagedObjectContext通知,ios,objective-c,cocoa,core-data,nsmanagedobjectcontext,Ios,Objective C,Cocoa,Core Data,Nsmanagedobjectcontext,当使用原语设置器(例如setPrimitiveValue:forKey:)更改NSManagedObjects(或其子类)的值时,这些更改是否会包含在NSManagedObjectContextObjectsDidChange通知的用户信息中,或者将对象列在NSManagedObjectContextDidSave通知的更新对象中 随后,原语设置的值是否会保存到磁盘?(假设使用sqlite持久存储) 我还没有找到任何关于这方面的具体信息,我不想从有限的测试中做出假设,或者至少在没有(尝试)深入理

当使用原语设置器(例如
setPrimitiveValue:forKey:
)更改
NSManagedObjects
(或其子类)的值时,这些更改是否会包含在
NSManagedObjectContextObjectsDidChange
通知的用户信息中,或者将对象列在
NSManagedObjectContextDidSave
通知的更新对象中

随后,原语设置的值是否会保存到磁盘?(假设使用sqlite持久存储)


我还没有找到任何关于这方面的具体信息,我不想从有限的测试中做出假设,或者至少在没有(尝试)深入理解的情况下。谢谢

设置原语值时,应确保通过手动包含适当的调用来触发通知。来自苹果示例代码“DateSectionTitles”:

如果设置原语值,则将触发NSManagedObjectContextObjectsIDChangeNotification通知

关于通知,根据文件:

userInfo字典包含以下键:NSInsertedObjectsKey、NSUpdatedObjectsKey和NSDeletedObjectsKey


通过一个小样本项目进行了进一步测试,以尽量减少其他因素,以下是我的发现:

保存取决于
willChangeValue:forKey:
通知。只要
NSManagedObject
与该键的KVC兼容,此调用就会将对象的
hasChanges
标志设置为
YES
。发生这种情况时,对象将包含在下一个
NSManagedObjectContextObjectsDidChange
通知中。
NSManagedObject
本身确切地知道哪些值已更改,而不管发布KVO通知的目的是什么

例如,即使通过原语setter更改了键A,并且发布了键B更改的通知,对象也会注意到键A的更改

类似地,
NSManagedObjectContextDidSave
只会保存其
hasChanges
YES
的对象,但同样,该对象知道所有更改的值,而不管发布的通知如何,所有更改都将保存到磁盘

我很惊讶,
didChangeValue:forKey:
对储蓄行为没有任何影响。但撤销管理是关键,这需要围绕原语setter对KVO调用进行标准包装才能正常工作:

[self willChangeValueForKey:@"key"];
[self setPrimitiveValue:value forKey:@"key"];`
[self didChangeValueForKey:@"key"]; 

你的测试结果是什么?
[self willChangeValueForKey:@"key"];
[self setPrimitiveValue:value forKey:@"key"];`
[self didChangeValueForKey:@"key"];