ios - 键值观察级联

标签 ios cocoa key-value-observing

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

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

最佳答案

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

如果我正确理解你的描述,观察者正在观察一个特定文档对象的属性。观察者没有观察到 currentUser 属性(它是另一个对象的一部分)。所以不,如果 currentUser 发生变化,观察者肯定不会收到通知。

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

想象一个类Event,它有一个读/写属性startDateendDate,以及一个计算属性duration > 根据开始和结束日期计算持续时间:

- (NSTimeInterval)duration
{
    return [[self endDate] timeIntervalSinceDate:[self startDate]];
}

您可以设置此类,以便当有人修改 startDateendDate 时,它会通知观察者 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/

相关文章:

ios - 为什么在 IOS 中单击按钮时 View 不显示?

cocoa - 使用 NSManagedObjectContext 的 objectWithID : 的 'proper' 方法是什么

objective-c - 更改 -observeValueForKeyPath :ofObject:change:context: 中的属性时,Cocoa 绑定(bind)不起作用

ios - Objective-C NSURLConnection didReceiveData在NSData中创建错误的JSON

ios - 在 Swift 中使用多个 View Controller

iphone - 具有不同单元格的 UITableView "behavior"

macos - 基于 NSSplitViewController 的应用程序几乎永远不会以正确的大小启动

objective-c - NSKeyedArchiver 写 XML(或其他人类可读的)?

swift - 如果在Class中创建了对象,如何在B类中观察?