美文网首页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