KVC
1.可重写下面2个方法使其不crash
- (nullable id)valueForUndefinedKey:(NSString *)key;
- (
void
)setValue:(nullable id)value forUndefinedKey:(NSString *)key;
2.集合操作符
@avg @count @sum @max @min
3.数组操作符
@unionOfObjects @distinctUnionOfObjects(去重)
KVO
1.- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
推荐使用静态变量的地址作为context,正确写法如下:
static void * SubViewControllerBalanceObserverContext = &SubViewControllerBalanceObserverContext;
2. 父子类同时监听需要判断
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if (context == SubViewControllerBalanceObserverContext)
{
NSLog(@"SubViewController NewBalance: %lf", self.model.balance);
}
else
{
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
3.手动触发KVO
场景:有时我们可能有一些需求,在属性值满足要求下才去触发KVO
+ (BOOL)automaticallyNotifiesObserversOfXXXX { return NO; }
- (void)setXXXX:(double)xxxx {
if (。。。)
[self willChangeValueForKey:@"XXXX"];
_XXXX = XXXX;
[self didChangeValueForKey:@"XXXX"];
}