四、Driver
Driver(司机?) 是一个精心准备的特征序列。它主要是为了简化 UI 层的代码。不过如果你遇到的序列具有以下特征,你也可以使用它:
不会产生 error 事件
一定在 MainScheduler 监听(主线程监听)
这些都是驱动 UI 的序列所具有的特征。

1、我们拿上面的代码做例子,研究Driver的特性, UIButton.init().rx.tap是一个controlEvent序列,先不用管它,直接看后面的

asDriver()返回了self.asDriver的闭包,直接进去看

self.asObservable()返回的是一个Observable序列,点进去看Driver的这个初始化方法,subscribeOn()序列是在主线程上执行

observeOn(DriverSharingStrategy.scheduler)表示在DriverSharingStrategy.scheduler这个线程上发送通知


由上可知DriverSharingStrategy.scheduler表示主线程

当出现error,会被替换成一个空元素。

返回一个Driver对象,

点进去找初始化方法,Driver实际上是一个SharedSequence(共享队列)的别名

初始化方法

SharingStrategy是DriverSharingStrategy,SharingStrategy.share(source)的share()方法即为,返回的是一个共享序列。

2、订阅序列

其他的调用顺序就和核心方法里的类似了,就不在详细描述了。
五、Signal
Signal和Driver的特征相似,唯一的区别是Driver会对新观察者回放(重新发送)上一个元素,而 Signal不会对新观察者回放上一个元素,这个区别是有share()方法决定的,具体如何实现的以后再说。


六、ControlEvent
ControlEvent 专门用于描述 UI 控件所产生的事件,它具有以下特征:
不会产生 error 事件
一定在 MainScheduler 订阅(主线程订阅)
一定在 MainScheduler 监听(主线程监听)
1、直接看例子

UIButton.init().rx.tap即为一个ControlEvent序列

点进去看controlEvent()方法

guard let control = control 做了nil判断,当对象为nil直接返回一个只有一个completed事件的序列

直接看这句

点击进去看,红色画框部分给control添加了点击了点击事件 selector为事件执行方法



由上可知,点击后会进到刚才的闭包中

后面的和核心方法中的流程类似了,最后会在外面的闭包B中执行

网友评论