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"];