典型的自定义访问器方法可以编写如下:
- (NSString *)name
{
[self willAccessValueForKey:@"name"];
NSString *myName = [self primitiveName];
[self didAccessValueForKey:@"name"];
return myName;
}
- (void)setName:(NSString *)newName
{
[self willChangeValueForKey:@"name"];
[self setPrimitiveName:newName];
[self didChangeValueForKey:@"name"];
}
setPrimitiveName
的含义很明显。它允许您在没有KVC的情况下访问“原始”变量(防止访问者内部的运行循环)并设置传入的值。可以对getter应用相同的观察。
从文档中可以清楚地看出setPrimitiveName
禁用了更改通知方法:willChangeValueForKey
和对等方。
现在我的问题如下:为什么需要在willChangeValueForKey:
和didChangeValueForKey:
方法中包含该方法?
阅读核心数据编程时写道:
NSManagedObject禁用自动键值观察(KVO)更改 建模属性的通知和原始访问器 方法不会调用访问和更改通知方法。对于 未建模的属性,在Mac OS X v10.4上,Core Data也会禁用 自动KVO;在Mac OS X v10.5及更高版本中,Core Data采用 NSObject的行为。
为什么我需要告知我已经准备好访问密钥(访问者或实例变量)然后我已经完成了它?谁被告知?
希望我的问题很明确。提前谢谢。
答案 0 :(得分:5)
您需要它来通知视图,您的值已更改。 举个例子,你可以使用 MKMapView 并在其上添加一些注释,从Core Data获取坐标,然后以某种方式改变它的位置。
如果你的getter / setter没有发布这些通知,那么 MKMapView 就不会知道这些位置的变化,也不会将其移动到新位置。
您还可以使用这些通知跟踪对象的创建/更改日期。
我想,重做/撤消也是由此做出的。
我想知道,如果Core Data以某种方式使用这些通知。有没有人对这个问题有任何想法?