为什么KVO观察者在观察无序的多对多关系时会看到一个空的NSKeyValueChangeNewKey?

时间:2013-04-11 14:52:04

标签: ios cocoa-touch key-value-observing

UIViewController子类上有一个属性,当视图变得可见时,该属性会发生变化。 (一组停止为空。)我已按如下方式实施KVC / KVO:

- (void)viewWillAppear:(BOOL)animated {
    [self willChangeValueForKey:@"anticipatedIndexPaths" withSetMutation:NSKeyValueSetSetMutation usingObjects:_anticipatedIndexPaths];

    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    assert([_anticipatedIndexPaths count]);
    [self didChangeValueForKey:@"anticipatedIndexPaths" withSetMutation:NSKeyValueSetSetMutation usingObjects:_anticipatedIndexPaths];
}

该类的子类正在观察@"anticipatedIndexPaths",但观察NSKeyValueChangeNewKeyNSKeyValueChangeReplacement的值始终为空集。是什么给了什么?

2 个答案:

答案 0 :(得分:1)

知道了。两件事:

首先,至少对于无序的多对多关系,KVO基础设施会在willChange-:调用中记录您的属性​​的值。在didChange-:上,它仅传递给定的集合减去之前的值。其次,在viewWillAppear:上,即使在[super viewWillAppear:]来电之前,hidden == NO

就我而言,这意味着属性正在返回非空集。 KVO减法的结果是空集。

答案 1 :(得分:0)

当您致电addObserver:...时,您是否正在通过NSKeyValueObservingOptionNew?默认情况下,您不会获得此值。