四、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中执行