Lor*_*o B 4 core-data accessor key-value-observing ios kvc
典型的自定义访问器方法可以编写如下:
- (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"];
}
Run Code Online (Sandbox Code Playgroud)
它的含义很清楚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的行为.
为什么我需要告知我已经准备好访问密钥(访问者或实例变量)然后我已经完成了它?谁被告知?
希望我的问题很明确.先感谢您.
您需要它来通知视图,您的值已更改.让我们举个例子,你可以使用MKMapView并在其上添加一些注释,从Core Data获取坐标,然后,不知何故,你改变它的位置.
如果你的getter/setter没有发布这些通知,那么MKMapView就不会知道这些位置的变化,也不会将它移动到新的位置.
您还可以使用这些通知跟踪对象的创建/更改日期.
我想,重做/撤消也是由此做出的.
我想知道,如果Core Data以某种方式使用这些通知.有没有人对这个问题有任何想法?