可能重复:
针对单个 KVC 更改接收 2 个 KVO 通知
我对应该在哪里使用willChangeValueForKey:
和didChangeValueForKey:
.
我有一个需要自定义设置方法的属性的对象。根据Apple 文档,我正在使用will/didChangeValueForKey:
:
要实现手动观察者通知,您在更改值之前调用 willChangeValueForKey: ,并在更改值之后调用 didChangeValueForKey: 。清单 3 中的示例实现了 openingBalance 属性的手动通知。
清单 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:
(即我的自定义设置器没有出现在堆栈中)。
更令人困惑的是,如果我在 的其他地方更改_Property
另一个函数cObject
,我的观察者将不会收到通知(当然,除非我使用did/willChangeValueForKey:
!)。
编辑:即使_Property
我的自定义设置器没有更改,KVO 也会通知我的观察者它已更改。由此,我得出结论,KVO 被调用只是因为我调用了 setter,无论是否有任何变化......
谁能解释我的情况与文档中解释的情况有何不同?