对于属性或一对一关系的属性,这需要您的类:
- 实施名为
-<key>
,-is<Key>
的方法,或者具有实例变量<key>
或_<key>
。
将观察者添加到“FAKE”属性的最佳方法是什么?
@property (nonatomic, readonly) BOOL shortlisted;
#pragma mark - Fake properties
- (BOOL)shortlisted
{
return [self.provider isJobShortlisted:self];
}
答案 0 :(得分:13)
如果您只有一个依赖于同一对象的另一个密钥的密钥,则可以覆盖+keyPathsForValuesAffectingValueForKey:
。 (另请参阅this article了解常见的陷阱。)
KVO文档包含有关依赖于其他对象的密钥的信息,但遗憾的是,它似乎只在OS X(而非iOS)上具有内置支持。
如果您要实现完全自定义的属性,KVO文档中Manual Change Notification部分的部分会提供您需要的所有信息。关键点是(来自文档的引用):
实现手动通知的类必须覆盖
automaticallyNotifiesObserversForKey:
的NSObject实现。 ...对于执行手动通知的属性,automaticallyNotifiesObserversForKey:
的子类实现应返回NO
。
要实现手动观察者通知,请调用 更改值前
willChangeValueForKey:
,更改值后didChangeValueForKey:
。
(如果您更改了多个属性,则可以嵌套这些调用。)
对于有序到多个关系,您不仅必须指定已更改的键,还必须指定更改类型和所涉及对象的索引。
为此,您使用方法willChange:valuesAtIndexes:forKey:
和didChange:valuesAtIndexes:forKey:
。