Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 核心数据中的自定义访问器方法,为什么使用KVO?_Ios_Core Data_Key Value Observing_Accessor_Kvc - Fatal编程技术网

Ios 核心数据中的自定义访问器方法,为什么使用KVO?

Ios 核心数据中的自定义访问器方法,为什么使用KVO?,ios,core-data,key-value-observing,accessor,kvc,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 willChangeVa

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

- (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的情况下访问“raw”变量(防止在访问器内运行循环),并设置传入的值。同样的观察结果也适用于吸气剂

从文档中可以清楚地看到,
setPrimitiveName
禁用更改通知方法:
willChangeValueForKey
和对应方法

现在我的问题是:为什么需要将该方法包装在
willChangeValueForKey:
didChangeValueForKey:
方法中

在读到核心数据编程时,会发现:

NSManagedObject禁用自动键值观察(KVO)更改 用于建模属性和基本访问器的通知 方法不调用访问和更改通知方法。对于 Mac OS X v10.4核心数据上的未建模属性也会禁用 自动KVO;在Mac OS X v10.5及更高版本上,核心数据采用 NSObject的行为

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


希望我的问题清楚。提前感谢。

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

如果getter/setter没有发布这些通知,MKMapView将不知道这些位置的更改,也不会将其移动到新位置

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

我想,重做/撤销也是由这个


我想知道,核心数据是否以某种方式在幕后使用这些通知。有人对这个问题有什么想法吗?

+1谢谢你的支持。这是只需要通知视图还是涉及其他内容?这是我到目前为止找到的示例,但是,可能还有更有趣的事情)是的,核心数据使用它们来知道何时触发故障并填充对象。谢谢你,Marcus。但它不是也用于核心数据中的撤销/重做跟踪吗