美文网首页iOS开发技术分享iOS魔法书
KVO底层原理和实际应用问题

KVO底层原理和实际应用问题

作者: 喵子G | 来源:发表于2017-11-02 10:37 被阅读336次
KVO原理

利用运行时,生成一个对象的子类,并生产子类的对象,并替换原来对象的isa指针,重写了监听属性的set方法。

KVO触发的条件

set方法调用。

KVO监听类型

NSKeyValueObservingOptionNew:返回新值
NSKeyValueObservingOptionOld:返回旧值
NSKeyValueObservingOptionInitial:在注册的时候发一次通知,在改变的时候也会发一次通知
NSKeyValueObservingOptionPrior:改变之前发一次通知,改变之后发一次通知

KVO调用方式

手动/自动(默认)。

将一个对象的KVO调用设置为手动

重写该对象的方法

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
    if ([key isEqualToString:@"name"]) {
        return NO;
    }
    return YES;
}

手动调用KVO

[self.person willChangeValueForKey:@"name"];
self.person.name = @"Jack";
[self.person didChangeValueForKey:@"name"];
KVO监听数组变化
[self.person addObserver:self forKeyPath:@"friends" options:NSKeyValueObservingOptionNew context:nil];
…
[[self.person mutableArrayValueForKey:@"friends"] addObject:@"Rose"];
KVO子级路径关联
@implementation JKRFamily
+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
    NSSet *keySet = [super keyPathsForValuesAffectingValueForKey:key];
    if ([key isEqualToString:@"person"]) {
        NSSet *set = [NSSet setWithObject:@"_person.name"];
        keySet = [keySet setByAddingObjectsFromSet:set];
    }
    return keySet;
}
@end

[self.family addObserver:self forKeyPath:@"person" options:NSKeyValueObservingOptionNew context:nil];

self.family.person.name = @"Jack";
KVO封装

http://www.jianshu.com/p/16bad5a5216d

相关文章

网友评论

    本文标题:KVO底层原理和实际应用问题

    本文链接:https://www.haomeiwen.com/subject/ellopxtx.html