KVO

使用KVO的要求是对象必须能支持kvc机制——所有NSObject的子类都支持这个机制。
1.一般使用

//添加监听者
[self.tableView addObserver: self forKeyPath: @"frame" options: NSKeyValueObservingOptionNew context: nil];
//监听属性值发生,改变时回调
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
}

2.如果一个属性是由其他几个属性决定,如firstName + lastName = fullName。fullName是由firstName和lastName决定的,想要监听fullName的变化,那么当firstName和lastName改动的时候,该值必须被通知
除了实现上面的基本方法,还要实现下面方法

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
    if ([key isEqualToString:@"fullName"]) {
        NSSet *affectingKeys = [NSSet setWithObjects:@"lastName", @"firstName",nil];
        keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKeys];
    }
    return keyPaths;
}

个人理解:在[xxx addObserver: self forKeyPath: @"fullName" options: NSKeyValueObservingOptionNew context: nil];建立观察者方法时候,会调用+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key方法,将其key扩充了
“lastName”和“firstName”,所以当firstName和lastName都会调用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context方法

你可能感兴趣的:(KVO)