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

时间:2012-04-14 11:11:10

标签: ios core-data key-value-observing accessor 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"];
}

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

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

希望我的问题很明确。提前谢谢。

1 个答案:

答案 0 :(得分:5)

您需要它来通知视图,您的值已更改。 举个例子,你可以使用 MKMapView 并在其上添加一些注释,从Core Data获取坐标,然后以某种方式改变它的位置。

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

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

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

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