美文网首页
KVO实现畅想

KVO实现畅想

作者: 亲爱的八路 | 来源:发表于2020-03-13 18:53 被阅读0次

前言:已经有一些很成熟的文章介绍kvo的原理iOS底层原理总结,英文好的同学可以直接看这篇。这里只是笔者的一些遐想,如果我设计kvo,我要怎么做。

把大象装进冰箱需要几步:

需要实现的功能:实时获取到属性变更,并通知观察者
第一步:需要知道这个属性变化了
第二步:把属性的变化送到观察者中去

第一步:

方法1 - 手动重写set方法:

属性变化被通知,让我实现,我肯定想的是在set方法中做文章。重写set方法,调用外部的类去传达这个变化。
但是这个需要重写set方法才能支持kvo。这样使用kvo的业务层会很头疼,每个能被观察的属性都需要重写set方法。

方法2 - Method Swizzling:

使用runtime功能,调换set方法,实现自动重写。这个需要在进程加载的时候使用runtime统一去做。
这种弊端太明显。业务层也有可能进行Method Swizzling,如果业务层swizzle后不调用原方法,kvo就失效了。而且一旦发生问题,很难调试。

方法3 - 编译时处理:

像ARC一样,在编译的时候手动给set方法加上需要的处理

这样实现的话,所有实例的属性变化的时候都会往外面调用方法,告诉外面我的值变了,不管该属性有没有被观察。这就需要中间加一层,查找该属性有没有被观察。所以每次类属性赋值,都要查询一遍观察者表。

系统的解决方案:

系统的方案是在运行时解决这件事。在每次属性被观察的时候,生成一个子类模版,子类模版里覆写set方法,并且把被观察的对象isa指针指向自动生成的子类。系统的方案优于方案三的地方是,减少了观察者表的查询。只有属性被观察了,属性的改变才会去查询观察者表。

第二步:

这里没查到相关资料,不过这步也比较简单了。以下是笔者猜想的实现逻辑:

需要一个观察者表,在add observer的时候,把观察者添加到以被观察者地址为key的一个表里。

{
  "被观察者地址 + keyPath": ["观察者地址", "观察者地址"]
}

这样每次被观察者的属性发生变化的时候,就去表里寻找自己相关属性的观察者,然后调用观察者的observeValueForKeyPath方法。

观察者是一个数组,这样可以允许多个观察者同时观察一个对象。这个数组是不去重的,实际使用kvo的时候会发现,如果对同一个属性的add observer两次,observeValueForKeyPath就会执行两次。

"被观察者地址 + keyPath" 是为了区分观察者观察的是哪一个属性,防止没有观察的属性发生变化也调用观察者的observeValueForKeyPath。

相关文章

  • KVO实现畅想

    前言:已经有一些很成熟的文章介绍kvo的原理iOS底层原理总结,英文好的同学可以直接看这篇。这里只是笔者的一些遐想...

  • 可能碰到的iOS笔试面试题(7)--KVO-KVC

    KVC-KVO KVC的底层实现? KVO的底层实现? 什么是KVO和KVC? KVO的缺陷? KVO是一个对象能...

  • iOS KVO

    KVO 示例 KVO的实现原理

  • iOS探索KVO实现原理,重写KVO

    写响应式编程博客时,提到了KVO,今天我们探索一下KVO的实现原理及如何自己实现KVO功能 首先简单的KVO实现 ...

  • iOS - KVO

    [toc] 参考 KVO KVC 【 iOS--KVO的实现原理与具体应用 】 【 IOS-详解KVO底层实现 】...

  • iOS原理篇(一): KVO实现原理

    KVO实现原理 什么是 KVO KVO 基本使用 KVO 的本质 总结 一 、 什么是KVO KVO(Key-Va...

  • iOS 自定义KVO

    自己实现kvo之前,需要知道iOS系统对kvo的实现。 系统实现kvo的原理 这依赖了OC强大的runtime特性...

  • iOS面试题(4) KVO KVC

    声明,不是原创,笔记均来自 群主大神~ 手动实现KVO 什么是KVO和KVC? KVO内部实现原理 NSNotif...

  • 通知 /KVO、KVC相关

    如何实现通知机制? KVO ·kvo是OC对观察者设计模式的又一实现 ·APPLE使用了isa混写实现kvo KV...

  • 面试题(2)

    runtime/KVO等面试题 1.KVO内部实现原则 回答:1>KVO是基于runtime机制实现的 2>当某个...

网友评论

      本文标题:KVO实现畅想

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