四、Driver
Driver(司機(jī)?)?是一個精心準(zhǔn)備的特征序列。它主要是為了簡化 UI 層的代碼。不過如果你遇到的序列具有以下特征,你也可以使用它:
不會產(chǎn)生?error?事件
一定在?MainScheduler?監(jiān)聽(主線程監(jiān)聽)
這些都是驅(qū)動 UI 的序列所具有的特征。

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

asDriver()返回了self.asDriver的閉包,直接進(jìn)去看

self.asObservable()返回的是一個Observable序列,點(diǎn)進(jìn)去看Driver的這個初始化方法,subscribeOn()序列是在主線程上執(zhí)行

observeOn(DriverSharingStrategy.scheduler)表示在DriverSharingStrategy.scheduler這個線程上發(fā)送通知


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

當(dāng)出現(xiàn)error,會被替換成一個空元素。

返回一個Driver對象,

點(diǎn)進(jìn)去找初始化方法,Driver實(shí)際上是一個SharedSequence(共享隊(duì)列)的別名

初始化方法

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

2、訂閱序列

其他的調(diào)用順序就和核心方法里的類似了,就不在詳細(xì)描述了。
五、Signal
Signal和Driver的特征相似,唯一的區(qū)別是Driver會對新觀察者回放(重新發(fā)送)上一個元素,而?Signal不會對新觀察者回放上一個元素,這個區(qū)別是有share()方法決定的,具體如何實(shí)現(xiàn)的以后再說。


六、ControlEvent
ControlEvent?專門用于描述?UI?控件所產(chǎn)生的事件,它具有以下特征:
不會產(chǎn)生?error?事件
一定在?MainScheduler?訂閱(主線程訂閱)
一定在?MainScheduler?監(jiān)聽(主線程監(jiān)聽)
1、直接看例子

?UIButton.init().rx.tap即為一個ControlEvent序列

點(diǎn)進(jìn)去看controlEvent()方法

?guard let control = control 做了nil判斷,當(dāng)對象為nil直接返回一個只有一個completed事件的序列

直接看這句

點(diǎn)擊進(jìn)去看,紅色畫框部分給control添加了點(diǎn)擊了點(diǎn)擊事件 selector為事件執(zhí)行方法



由上可知,點(diǎn)擊后會進(jìn)到剛才的閉包中

后面的和核心方法中的流程類似了,最后會在外面的閉包B中執(zhí)行
