更改通知是否与KVO级联到其属性,或者是否有任何优雅方式不包括通过简单地观察父级和子级更改来手动实现它?
假设我们有一个User类和一个Document类。一个用户可以拥有任何数量的文档。现在让我们假设我有一个视图控制器显示有关文档的详细信息,我们还假设我在某处存储了一个名为currentUser的变量。如果我现在观察一个文档对象属于那个也是currentUser的值的用户,并且我将currentUser更改为另一个用户,则更改通知“级联”将向下移动到仅观察文档对象的视图控制器属于以前的“currentUser”?
答案 0 :(得分:5)
观察者只接收有关它实际观察的(特定)对象的(特定)属性的通知。它不会收到有关任何其他更改的通知。
如果我正确理解您的描述,观察者正在观察一个特定文档对象的属性。观察者没有观察到currentUser
属性(它是另一个对象的一部分)。所以不,如果currentUser
发生变化,观察者肯定不会收到通知。
但是,在KVO中,可以触发受另一个属性更改影响的属性的更改通知。这通常用于计算属性:
想象一个类Event
具有读/写属性startDate
和endDate
,以及计算属性duration
,它根据开始和结束日期计算持续时间:
- (NSTimeInterval)duration
{
return [[self endDate] timeIntervalSinceDate:[self startDate]];
}
您可以设置此类,以便在有人修改duration
或startDate
时通知观察者endDate
:
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
{
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"duration"]) {
keyPaths = [keyPaths setByAddingObjectsFromSet:
[NSSet setWithObjects:@"startDate", @"endDate", nil]
];
}
return keyPaths;
}
中有更详细的描述