4

一个典型的自定义访问器方法可以写成如下:

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

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

希望我的问题很清楚。先感谢您。

4

1 回答 1

5

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

If you getter/setter didn't post these notifications, MKMapView wouldn't know of these changes in locations, and wouldn't move it to the new one.

You can also track the date of creation/change of your objects with these notifications.

I guess, that redo/undo is also made by this.

NOTE

I would like to know, if Core Data uses these notifications somehow under the hood. Does anybody has any ideas on this subject?

于 2012-04-14T11:27:50.337 回答