gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:40:21 26 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Receiving 2 KVO notifications for a single KVC change

我对应该在哪里使用 willChangeValueForKey: and didChangeValueForKey: 感到困惑.

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

To implement manual observer notification, you invoke willChangeValueForKey: before changing the value, and didChangeValueForKey: after changing the value. The example in Listing 3 implements manual notifications for the openingBalance property.

Listing 3 Example accessor method implementing manual notification

- (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

我困惑的根源在于,如果我设置另一个对象来观察 cObject 实例上的 Property,然后调用 [myObject setProperty:],我的观察者的回调函数被点击了两次。查看堆栈:第一次命中是我调用 didChangeValueForKey: 的结果,第二次命中是我调用 setProperty: 的直接结果(即我的自定义 setter不会出现在堆栈中)。

为了进一步增加困惑,如果我在 cObject 的其他地方的另一个函数中更改 _Property,我的观察者将不会收到通知(除非我使用 did/willChangeValueForKey:,当然!)。

编辑:即使我没有在我的自定义 setter 中更改 _Property,KVO 也会通知我的观察者它已更改。由此,我得出结论,KVO 被调用只是因为我调用了 setter,无论是否有任何变化......

谁能解释我的情况与文档中解释的情况有何不同?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com