我应该在自定义setter中使用will / didSetValueForKey吗?

可能重复:
为单个KVC更改接收2个KVO通知

我很困惑我应该在哪里使用willChangeValueForKey:didChangeValueForKey: willChangeValueForKey:

我有一个需要自定义setter方法的属性的对象。 根据Apple文档,我正在使用will/didChangeValueForKey: ::

要实现手动观察者通知,可以在更改值之前调用willChangeValueForKey:并在更改值之后调用didChangeValueForKey:。 清单3中的示例实现了opensBalance属性的手动通知。

清单3实现手动通知的示例访问器方法

- (void)setOpeningBalance:(double)theBalance {
    [self willChangeValueForKey:@"openingBalance"];
    _openingBalance = theBalance;
    [self didChangeValueForKey:@"openingBalance"];
}

这使得我的对象如下所示:

@interface cObject
@property (readwrite, nonatomic) BOOL Property;
@end

@implementation cObject
- (void)setProperty:(BOOL)Property
{
   [self willChangeValueForKey:@"Property"];
   _Property = Property;
   [self didChangeValueForKey:@"Property"];
   //Do some other stuff
}
@end

我混淆的原因是,如果我设置另一个对象来观察PropertycObject实例,然后调用[myObject setProperty:] ,我的观察者的回调函数会被击中两次 。 查看堆栈:第一次打击是因为我调用了didChangeValueForKey:的结果,第二次打击是我调用setProperty:的直接结果setProperty:即我的自定义setter未出现在堆栈中)。

为了进一步增加混乱,如果我改变_Property在另一个函数在其他地方cObject ,我的观测将不会收到通知(除非我用did/willChangeValueForKey:当然)。

编辑:即使我不改变_Property在我的自定义二传手,KVO通知我的观察员,它已经改变。 由此,我得出结论,KVO被调用仅仅是我调用setter的结果,不管是否有任何变化或不...

任何人都可以解释我的情况与文档中解释的情况有什么不同吗?


来自文档。 如果你想手动,你必须覆盖:

手动更改通知

手动更改通知可更细致地控制通知发送给观察者的方式和时间。 这可以帮助最小化不必要的触发通知,或将多个更改分组为单个通知。

实现手动通知的类必须覆盖自动通知ObserversForKey:的NSObject实现。 可以在同一个班级中同时使用自动和手动观察员通知。 对于执行手动通知的属性,自动NotNotifyObserversForKey的子类实现应该返回NO。 子类实现应该为任何无法识别的键调用super。 清单2中的示例使opensBalance属性的手动通知允许超类确定所有其他键的通知。

链接地址: http://www.djcxy.com/p/47345.html

上一篇: Should I use will/didSetValueForKey inside a custom setter?

下一篇: KVO not working for class property