【问题标题】:Key Value Observing Cascading键值观察级联
【发布时间】:2011-06-21 16:26:07
【问题描述】:

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

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

【问题讨论】:

  • 你尝试的时候发生了什么?
  • 正如在下面的答案中所说,您必须做更多工作才能通知“受影响”属性的观察者。

标签: ios cocoa key-value-observing


【解决方案1】:

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

如果我正确理解了您的描述,则观察者正在观察一个特定文档对象的属性。观察者没有观察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中有更详细的描述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多