objective-c – 何时使用“willChangeValueForKey”和“didChangeValueForKey”?

我在一个演示项目中看到了这些行,但我不明白为什么这样做。

[self willChangeValueForKey:@"names"];
[self didChangeValueForKey:@"names"];

它在willChangeeValueForKey之后立即调用didChangeValueForKey。
它有什么意义吗?

此外,何时应该是正确的时间来调用这两种方法?
非常感谢!! 🙂

这实际上是一种反模式。您不应该调用-willChangeValueForKey:后跟-didChangeValueForKey:没有任何干预的实际属性更改。在某些情况下,这样做可以掩盖代码中其他地方的KVO问题,并强制观察者更新他们与相关属性相关的状态。但是,最终,你(或你举的例子的作者)应该修复其余的代码,使这个反模式是不必要的。

-will | didChangeValueForKey的正确用法是当您修改属性而不使用KVC兼容的访问器/ setter,使得KVO机制不会注意到更改。对于一个设计的示例,请考虑直接修改属性的后端实例变量:

@interface Foo
{
   int bar;
}
@end

@implementation Foo
- (void)someMethod
{
  bar = 10;
}
@end

已注册通知酒吧资产变更通知的KVO观察员不会收到-someMethod中酒吧更改的通知。要使KVO机制工作,可以修改-someMethod:

- (void)someMethod
{
  [self willChangeValueForKey:@"bar"];
  bar = 10;
  [self didChangeValueForKey:@"bar"];
}

当然,最好使用@property声明并使用符合KVC的访问器/ setter(手动编码或@synthesized),但这是一个假设的例子。

http://stackoverflow.com/questions/3018242/when-to-use-willchangevalueforkey-and-didchangevalueforkey

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:objective-c – 何时使用“willChangeValueForKey”和“didChangeValueForKey”?