<~ ReactiveSwift中的BindingSource && BindingTarget 源码解析

在ReactiveSwift中,<~运算符实现了数据源(Source)到数据目标(Target)之间的绑定关系,实现了数据源的值发生变化时,数据目标同时得到更新,实际应用一般是在UI控件的值随与之绑定的ViewModel的值同步更新。

例如一个UILabel,绑定到ViewModel中的labelValue: MutableProperty

let label = UILabel()

label.reactive.text <~ viewModel.labelValue

之后,一旦ViewModel的labelValue值发生变化,则同步到视图中的label进行显示,一次绑定,终生享用,无需人工干预。

那么,这种绑定关系如何实现的,下面进行源码分析

从 <~的源码开始分析入手:

image.png

<~函数在BindingTargetProvider协议中声明,调用这个方法是由表达式左边的对象作为Self发起的

BindingTarget <~ BindingSource
e.g. label.reactive.text <~ viewModel.labelValue

首先我们分析BindingTarget

image.png

image.png

BindingTarget主要包含一个(Value) -> Void 的action闭包,在构造的时候传入action逃逸闭包

通过让UILabel遵守ReactiveExtensionProvider协议,并扩展Reactive where Base: UILabel方式,为UILabel增加Reactive扩展属性


image.png

image.png

image.png

image.png

makeBindingTarget { 0.text =1 } 实现了BindingTarget的self.base.text = value的赋值动作,也是在<~运算符中的provider.bindingTarget.action动作,就是这里的赋值动作,至此,BindingTarget这端的动作及协议实现完成,下面来看BindingSource这边需要完成的协议。

我们来实现一个简单的AA类,让这个类同时符合BindingTarget和BindingSource两个协议的要求

image.png

AA类的实现点:

  1. 在构造时,自身保存一对(signal, observer)

  2. 扩展AA类遵守BindingSource协议,声明producer计算属性,在SignalProducer的startHandler中,调用自身的observer发送值消息,并将SignalProducer构造的observer添加至自身signal中保存

  3. 扩展AA类遵守BindingTarget协议,声明tareget计算属性,返回makeBindingTarget { $0.name = $1 },完成赋值动作,这里多讲一点的就是,makeBindingTarget是对BindingTarget的二次封装,在BindingTarget构造中,action是(Value) -> Void类型,这里的makeBindingTarget传参是(Base, Value) -> Void类型,展开makeBindingTarget方法后,可以看到它是怎么进行二次封装的,添加了Base属性在其中。

  4. 声明changeValue(value: String)方法,在赋值过程中,调用一次自身的observer发送值消息,这里的changeValue动作类似MutableProperty对值类型的封装过程,并这里作了简化便于理解原理,在MutableProperty的赋值过程中,是调用了内部的Box对存储的值进行了一次封装,并涉及到原子操作。


    image.png

调用AA.changeValue后,一次调用AA自身的observer.send -> AA.producer.observer.send -> provider.bindingTarget.action 最终完成赋值动作

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,282评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,681评论 1 32
  • 有人从现实中找领悟,有人从剧集中找生活的本真。抽风挖出陈浩民跟佘诗曼的老片《带我飞带我走》,剧情真的很好诠释了什么...
    李莫愁是我阅读 163评论 0 0
  • 图文/巴山雨 转载请联系作者授权 每天手绘一张圆形禅绕画,第100天会怎样?喜欢就来关注雨姐姐的专题我真的来画画,...
    巴山雨阅读 1,016评论 0 1
  • 简介 通俗的称为写时拷贝的一种机制,也就是说读的时候并不需要拷贝 应用场景 并发线程中对同一块资源同时处理数据错乱...
    蚂蚁牙齿不黑阅读 1,844评论 1 0

友情链接更多精彩内容