Core Data中的自定义访问器方法,为什么使用KVO?

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的行为.

为什么我需要告知我已经准备好访问密钥(访问者或实例变量)然后我已经完成了它?谁被告知?

希望我的问题很明确.先感谢您.

Nik*_*rov 5

您需要它来通知视图,您的值已更改.让我们举个例子,你可以使用MKMapView并在其上添加一些注释,从Core Data获取坐标,然后,不知何故,你改变它的位置.

如果你的getter/setter没有发布这些通知,那么MKMapView就不会知道这些位置的变化,也不会将它移动到新的位置.

您还可以使用这些通知跟踪对象的创建/更改日期.

我想,重做/撤消也是由此做出的.

注意

我想知道,如果Core Data以某种方式使用这些通知.有没有人对这个问题有任何想法?

  • 是的,Core Data使用它们来了解何时触发故障并填充对象. (2认同)