关键值观察级联

Rap*_*ael 2 cocoa key-value-observing ios

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

假设我们有一个User类和一个Document类.一个用户可以拥有任何数量的文档.现在让我们假设我有一个视图控制器显示有关文档的详细信息,我们还假设我在某处存储了一个名为currentUser的变量.如果我现在观察一个文档对象属于那个也是currentUser的值的用户,并且我将currentUser更改为另一个用户,则更改通知"级联"将向下移动到仅观察文档对象的视图控制器属于以前的"currentUser"?

puz*_*zle 5

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

如果我正确理解您的描述,观察者将观察一个特定文档对象的属性.观察者没有观察到currentUser属性(属于另一个对象).所以不,如果currentUser发生变化,观察者肯定不会收到通知.

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

想象一下,一类Event具有读/写性能startDateendDate和计算性能duration,计算基于开始和结束日期时间:

- (NSTimeInterval)duration
{
    return [[self endDate] timeIntervalSinceDate:[self startDate]];
}
Run Code Online (Sandbox Code Playgroud)

您可以设置此类,以便通知观察者duration何时修改startDateendDate:

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

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

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

    }

    return keyPaths;
}
Run Code Online (Sandbox Code Playgroud)

这在Key-Value Observing Programming Guide中有更详细的描述.