sam*_*m-w 2 objective-c key-value-observing ios ios6
可能重复:
为单个KVC更改接收2个KVO通知
我很困惑,我应该使用willChangeValueForKey:和didChangeValueForKey:.
我有一个具有属性的对象,该属性需要自定义setter方法.根据Apple文档,我使用will/didChangeValueForKey::
要实现手动观察者通知,请在更改值之前调用willChangeValueForKey:和更改值后调用didChangeValueForKey :. 清单3中的示例实现了opensBalance属性的手动通知.
清单3 实现手动通知的示例访问器方法
Run Code Online (Sandbox Code Playgroud)- (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
Run Code Online (Sandbox Code Playgroud)
我混淆的原因是,如果我设置另一个对象来观察Property一个实例,cObject然后调用[myObject setProperty:],我的观察者的回调函数会被击中两次.看堆栈:第一次命中是因为我调用didChangeValueForKey:,第二次命中是我调用的直接结果setProperty:(即我的自定义setter没有出现在堆栈中).
为了进一步增加混乱,如果我_Property在其他地方改变了另一个功能cObject,我的观察者将不会得到通知(did/willChangeValueForKey:当然,除非我使用!).
编辑:即使我没有更改_Property我的自定义设置器,KVO也会通知我的观察者它已经改变了.由此,我得出结论,KVO被调用是因为我调用了setter,无论是否有任何改变......
任何人都可以解释我的情况与文档中解释的不同吗?
来自文档.如果你想手动,你必须覆盖:
手动更改通知
手动更改通知可以更加精细地控制向观察者发送通知的方式和时间.这有助于最大限度地减少不必要的触发通知,或将大量更改分组到单个通知中.
实现手动通知的类必须覆盖automaticNotifiesObserversForKey:的NSObject实现.可以在同一个类中同时使用自动和手动观察器通知.对于执行手动通知的属性,automaticNotifiesObserversForKey:的子类实现应返回NO.子类实现应该为任何无法识别的键调用super.清单2中的示例启用了opensBalance属性的手动通知,允许超类确定所有其他键的通知.
| 归档时间: |
|
| 查看次数: |
1553 次 |
| 最近记录: |