Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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 关键值观察级联_Ios_Cocoa_Key Value Observing - Fatal编程技术网

Ios 关键值观察级联

Ios 关键值观察级联,ios,cocoa,key-value-observing,Ios,Cocoa,Key Value Observing,更改通知是否与KVO级联到它们的属性,或者是否有任何优雅的方法不包括通过简单地观察父项和子项更改来手动实现它 假设我们有一个用户类和一个文档类。一个用户可以拥有任意数量的文档。现在,假设我有一个视图控制器,显示文档的详细信息,并且假设我在某处存储了一个名为currentUser的变量。如果我现在观察到一个属于该用户(也是currentUser的值)的文档对象,并且我将currentUser更改为另一个用户,那么更改通知是否会“级联”到仅观察属于前一个“currentUser”的文档对象的视图控制

更改通知是否与KVO级联到它们的属性,或者是否有任何优雅的方法不包括通过简单地观察父项和子项更改来手动实现它


假设我们有一个用户类和一个文档类。一个用户可以拥有任意数量的文档。现在,假设我有一个视图控制器,显示文档的详细信息,并且假设我在某处存储了一个名为currentUser的变量。如果我现在观察到一个属于该用户(也是currentUser的值)的文档对象,并且我将currentUser更改为另一个用户,那么更改通知是否会“级联”到仅观察属于前一个“currentUser”的文档对象的视图控制器?

观察者只接收有关其实际观察的(特定)对象的(特定)属性的通知。它不会收到关于任何其他更改的通知

如果我正确理解了您的描述,那么观察者正在观察一个特定文档对象的属性。观察者没有观察到
currentUser
属性(它是另一个对象的一部分)。因此,如果
currentUser
发生更改,观测者肯定不会收到通知

但是,在KVO中,可以触发受另一个属性更改影响的属性的更改通知。这通常用于计算属性:

想象一个类
事件
,它有一个读/写属性
开始日期
结束日期
,以及一个计算属性
持续时间
,该属性基于开始日期和结束日期计算持续时间:

- (NSTimeInterval)duration
{
    return [[self endDate] timeIntervalSinceDate:[self startDate]];
}
您可以设置该类,以便当有人修改
开始日期
结束日期
时,它通知观察者
持续时间

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
{
    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];

    if ([key isEqualToString:@"duration"]) {

        keyPaths = [keyPaths setByAddingObjectsFromSet:
            [NSSet setWithObjects:@"startDate", @"endDate", nil]
        ];

    }

    return keyPaths;
}

这在。

中有更详细的描述。当您尝试它时发生了什么?正如下面的回答中所说,您必须做更多的工作来通知“受影响”的酒店观察家。