我应该在自定义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
我混淆的原因是,如果我设置另一个对象来观察Property
的cObject
实例,然后调用[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?