0

当使用原始设置器(例如setPrimitiveValue:forKey:)更改NSManagedObjects(或其子类)的值时,这些更改将包含在NSManagedObjectContextObjectsDidChange通知的 userInfo 中,还是将对象列在NSManagedObjectContextDidSave通知的 updatedObjects 中?

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

我无法找到任何关于此的具体信息,我宁愿不从我有限的测试中做出假设,或者至少在没有(尝试)更深入地理解它的情况下做出假设。谢谢!

4

2 回答 2

0

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

// getter
[self willAccessValueForKey:@"sectionIdentifier"];
NSString *tmp = [self primitiveSectionIdentifier];
[self didAccessValueForKey:@"sectionIdentifier"];

// setter
[self willChangeValueForKey:@"timeStamp"];
[self setPrimitiveTimeStamp:newDate];
[self didChangeValueForKey:@"timeStamp"];

如果您设置原始值,将NSManagedObjectContextObjectsDidChangeNotication触发通知。

至于通知,根据文档:

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

于 2013-08-09T10:22:58.370 回答
0

用一个小样本项目做了一些进一步的测试,以尽量减少其他因素,这是我的发现:

保存取决于willChangeValue:forKey:通知。只要NSManagedObject该键的 KVC 兼容,此调用就会将对象的hasChanges标志设置为YESNSManagedObjectContextObjectsDidChange发生这种情况时,下一个通知中将包含一个对象。NSManagedObject不管 KVO 通知是针对什么键发布的,它本身都知道哪些值发生了变化。

例如,即使键 A 通过原始设置器更改,并且发布了键 B 更改的通知,对象也会注意到键 A 的更改。

类似地,NSManagedObjectContextDidSave将只保存一个对象,该对象hasChanges仍然YES知道所有更改的值,而不管发布的通知如何,并且所有更改都将保存到磁盘。

我很惊讶这didChangeValue:forKey:对储蓄行为没有任何影响。但是,撤销管理是关键,这需要围绕原始设置器的 KVO 调用的标准包装才能起作用:

[self willChangeValueForKey:@"key"];
[self setPrimitiveValue:value forKey:@"key"];`
[self didChangeValueForKey:@"key"]; 
于 2013-08-11T20:37:54.303 回答