【问题标题】:How do I override a getter for a KVO-compliant property?如何覆盖符合 KVO 的属性的 getter?
【发布时间】:2014-08-20 09:28:16
【问题描述】:

我想创建一个需要自定义-isReady 的 NSOperation 子类,它是符合 KVO 的属性的 getter。我的覆盖将对我的自定义测试和super 的方法版本进行布尔与。但是覆盖仍然必须保持 KVO 合规性。那么,如何?

【问题讨论】:

  • KVO 如何影响属性 getter?
  • 我不想不小心写出不符合 KVO 的覆盖。

标签: objective-c cocoa key-value-observing nsoperation


【解决方案1】:

没什么特别的,因为合成属性符合 KVC 和 KVO:

属性:

@property (nonatomic, readwrite, getter=isReady) BOOL ready;`

实现:

@synthesize ready;

- (BOOL) isReady {
   // your custom logic here.
}

对于NSOperation 子类,这些属性的KVO 通知将是自动的。您无需再做任何事情(您无需调用 will/didSetValueForKey)。 如果NSOperation 集合访问器(例如isReadyisFinished)的行为依赖于其他属性或键路径,请务必将它们注册到KVO:

+ (NSSet *) keyPathsForValuesAffectingIsFinished {
    NSSet   *result = [NSSet setWithObject:@"finished"];
    return result;
}

【讨论】:

  • 对我的代码重要的是isReady 的实现包含了超类的版本。当任何一个版本发生变化时都会有 KVO 通知,这对我来说是完美的,因为听众无法分辨广播的是哪个版本。 (如果我不得不禁止超类的 KVO 通知,我会遇到麻烦。)
  • 我一直想自己回答并关闭查询,但我拖延了。对你来说是件好事,因为我可能会给你荣誉。
猜你喜欢
  • 2018-11-08
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2019-02-28
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多