更改通知是否与 KVO 级联到其属性,或者是否有任何优雅的方法不包括通过简单地观察父级和子级更改来手动实现它?
假设我们有一个 User 类和一个 Document 类。一个用户可以拥有任意数量的文档。现在假设我有一个 View Controller 显示有关文档的详细信息,并且还假设我在某处存储了一个名为 currentUser 的变量。如果我现在观察到属于该用户的一个文档对象,该用户也是 currentUser 的值,并且我将 currentUser 更改为另一用户,则更改通知是否会“级联”到仅观察该文档对象的 View Controller 属于之前的“currentUser”?
最佳答案
观察者仅接收有关其实际观察的(特定)对象的(特定)属性的通知。它不会收到有关任何其他更改的通知。
如果我正确理解你的描述,观察者正在观察一个特定文档对象的属性。观察者没有观察到 currentUser 属性(它是另一个对象的一部分)。所以不,如果 currentUser
发生变化,观察者肯定不会收到通知。
但是,在 KVO 中,可以为受另一个属性更改影响的属性触发更改通知。这通常用于计算属性:
想象一个类Event
,它有一个读/写属性startDate
和endDate
,以及一个计算属性duration
> 根据开始和结束日期计算持续时间:
- (NSTimeInterval)duration
{
return [[self endDate] timeIntervalSinceDate:[self startDate]];
}
您可以设置此类,以便当有人修改 startDate
或 endDate
时,它会通知观察者 duration
:
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
{
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"duration"]) {
keyPaths = [keyPaths setByAddingObjectsFromSet:
[NSSet setWithObjects:@"startDate", @"endDate", nil]
];
}
return keyPaths;
}
这在Key-Value Observing Programming Guide中有更详细的描述。 .
关于ios - 键值观察级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6428727/