- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在一个演示项目中看到了这些行,但我不明白为什么会这样。
[self willChangeValueForKey:@"names"];
[self didChangeValueForKey:@"names"];
它在 willChangeValueForKey 之后立即调用了 didChangeValueForKey。有什么意义吗?
此外,什么时候调用这两个方法比较合适?非常感谢!! :)
最佳答案
事实上,这是一种反模式。你不应该调用 -willChangeValueForKey:
然后调用 -didChangeValueForKey:
没有任何干预的实际属性更改。在某些情况下,这样做可以掩盖代码中其他地方的 KVO 问题,并强制观察者更新与相关属性相关的状态。然而,最终,您(或您引用的示例的作者)应该修复其余代码,这样就不需要这种反模式了。
-will|didChangeValueForKey:
的正确用法是当您在不使用符合 KVC 的访问器/ setter 的情况下修改属性时,这样 KVO 机制就不会注意到更改。举一个人为的例子,考虑直接修改属性的支持实例变量:
@interface Foo
{
int bar;
}
@end
@implementation Foo
- (void)someMethod
{
bar = 10;
}
@end
已注册 bar
属性更改通知的 KVO 观察者将不会收到 -someMethod
中 bar
的更改通知。要使 KVO 机制工作,您可以修改 -someMethod
:
- (void)someMethod
{
[self willChangeValueForKey:@"bar"];
bar = 10;
[self didChangeValueForKey:@"bar"];
}
当然,最好使用 @property
声明并使用符合 KVC 的访问器/ setter (手动编码或@synthesized
),但这是一个人为的例子。
关于objective-c - 什么时候使用 "willChangeValueForKey"和 "didChangeValueForKey"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3018242/
我有一个充当播放列表的托管对象,它与播放列表项具有一对多关系。可以有多个播放列表,但只有一个“事件”播放列表。事件播放列表由托管对象上的 bool 属性指示。 我将事件播放列表中的项目数显示为标签
我认为自制的@property setter 应该是这样的: -(void) setFoo:(Foo *)newFoo { // Safeguards // ... [self willC
我对 Objective-C 中的 KVO 有点困惑。如果我的属性符合 KVO 标准,我有两种选择来发出通知:1. addObserver:.../observeValueForKeyPath:...
NSManagedObject 的苹果文档不鼓励覆盖“didChangeValueForKey:withSetMutation:usingObjects:”。 为什么? 只要我调用 [super ..
我在一个演示项目中看到了这些行,但我不明白为什么会这样。 [self willChangeValueForKey:@"names"]; [self didChangeValueForKey:@"nam
根据 Apple 自己的建议,当手动设置 KVC/KVO 兼容访问器时,应该包括 BOTH KVO 方法 willChange 和 didChange。这就是我在所有手动访问器方法中所做的。 但是,o
我一直在尝试修复我们的 NSOperation 子类中的一个问题,我觉得它可能与我们对 KVO 的手动更改通知有关。在更新 NSOperation 状态时,我检查过的所有来源似乎都执行以下操作: [s
我是一名优秀的程序员,十分优秀!