OC之KVO

作者: iOS小洁 | 来源:发表于2022-12-07 17:53 被阅读0次

KVO

KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变

KVO 使用方式

1、添加观察者

// 摘自AFNetworking
for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {
        if ([self respondsToSelector:NSSelectorFromString(keyPath)]) {
            [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:AFHTTPRequestSerializerObserverContext];
        }
    }

2、实现 observeValueForKeyPath:ofObject:change:context: 方法

// 摘自AFNetworking
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(__unused id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{
    if (context == AFHTTPRequestSerializerObserverContext) {
        if ([change[NSKeyValueChangeNewKey] isEqual:[NSNull null]]) {
            [self.mutableObservedChangedKeyPaths removeObject:keyPath];
        } else {
            [self.mutableObservedChangedKeyPaths addObject:keyPath];
        }
    }
}

3、移除观察者 removeObserver:forKeyPath:

- (void)dealloc {
    for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {
        if ([self respondsToSelector:NSSelectorFromString(keyPath)]) {
            [self removeObserver:self forKeyPath:keyPath context:AFHTTPRequestSerializerObserverContext];
        }
    }
}

KVO 禁用

// 摘自AFNetworking
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
    if ([AFHTTPRequestSerializerObservedKeyPaths() containsObject:key]) {
        return NO;
    }

    return [super automaticallyNotifiesObserversForKey:key];
}

KVO 设置依赖

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
    if ([key isEqualToString:@"reachable"] || [key isEqualToString:@"reachableViaWWAN"] || [key isEqualToString:@"reachableViaWiFi"]) {
        return [NSSet setWithObject:@"networkReachabilityStatus"];
    }

    return [super keyPathsForValuesAffectingValueForKey:key];
}

KVO原理

1:动态生成子类:NSKVONotifiy_A

2:给动态子类添加Setter方法

3:消息转发给父类(runtime消息转发)

image-20220601140719614 image-20220601140706480

_NSSet*ValueAndNotify的内部实现

调用willChangeValueForKey:

调用原来的setter实现

调用didChangeValueForKey:

  • didChangeValueForKey:内部会调用observer的observeValueForKeyPath:ofObject:change:context:方法

KVO存在问题

1、必须成对出现

2、重复添加,重复几次,执行几次响应

3、重复移除,移除超过添加次数后,NSRangeException报错。

在移除观察的时候NSKVONotifying_XXX 是否移除? + isa 是否会回来? 答:不会

相关文章

  • OC之KVO

    KVO KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变 ...

  • swift中KVO和属性观察器

    开篇提醒:OC中的KVO及其KVO的基础知识可参见:深入runtime探究KVO Swift中,原本没有KVO模式...

  • iOS KVO的底层实现原理

    KVO 是 OC 观察者设计模式的一种KVO 的实现依赖于 OC 强大的 RuntimeKVO是Cocoa提供的...

  • KVO

    今天和大家讨论一下OC中KVO(KeyValueObserving)键值观察 KVO定义 KVO是iOS开发中的一...

  • OC的KVO学习记录(2)

    仿写KVO的实现KVO原理参考可前一篇OC的KVO学习记录代码github地址:Sameny仿写KVO 注:关键代...

  • OC KVO

    1. KVO 是什么? KVO是OC观察者模式的一种实现(另一种是NSNotification[https://w...

  • iOS知识点小结

    1.KVO1.1> KVO 简介:KVO 是 OC 观察者设计模式的一种实现.KVO 指定一个被观察的对象的属性,...

  • OC观察者模式之KVO

    KVO: KVO是key-value observing的缩写 KVO是OC对观察者设计模式的又一实现 苹果使用了...

  • iOS之OC中KVO

    4个步骤: 1.初始化类,并且设置监听 2.修改值 3.对监听到被修改的值做对应操作 4.移除监听 #import...

  • KVO读书笔记

    KVO是什么 KVO 是 OC 对 观察者模式的实现。 KVO提供一种机制,指定一个被观察对象A,...

网友评论

    本文标题:OC之KVO

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