RxSwift學(xué)習(xí)筆記

以下是自己學(xué)習(xí)的一些簡(jiǎn)要記錄

1.Disposing:變量所占用的內(nèi)存空間釋放掉(手動(dòng)釋放)

2.Dispose Bags:變量所占用的內(nèi)存空間釋放掉 (自動(dòng)釋放- 推薦用這種)

原理:創(chuàng)建一個(gè)disposeBag來(lái)盛放我們需要管理的資源,然后把新建的監(jiān)聽都放進(jìn)去,會(huì)在適當(dāng)?shù)臅r(shí)候銷毀這些資源。如果你需要立即釋放資源只需要新建一個(gè)DisposeBag(),那么上一個(gè)DisposeBag就會(huì)被銷毀。

3.Scheduler:這個(gè)東西其實(shí)就是線程

CurrentThreadScheduler --- 這是一個(gè)串行(Serial)隊(duì)列,也是默認(rèn)線程

MainScheduler

--- 這是主線程,也是一個(gè)串行隊(duì)列

SerialDispatchQueueScheduler --- 這是GCD中的串行隊(duì)列

ConcurrentDispatchQueueScheduler --- 這是GCD中的并發(fā)隊(duì)列

OperationQueueScheduler --- 這是一個(gè)NSOperationQueue并發(fā)隊(duì)列

4.observeOn()和subscribeOn()

**區(qū)別: **subscribeOn()設(shè)置起點(diǎn)在哪個(gè)線程,observeOn()設(shè)置了后續(xù)工作在哪個(gè)線程

總結(jié):subscribeOn只是影響事件鏈開始默認(rèn)的線程,而observeOn規(guī)定了下一步動(dòng)作發(fā)生在哪個(gè)線程中。

5.shareReplay(1)

map函數(shù)執(zhí)行了兩遍,但是有些時(shí)候我不需要map函數(shù)里的東西執(zhí)行兩遍,比如map函數(shù)里面如果執(zhí)行的是網(wǎng)絡(luò)請(qǐng)求,我只需要一次請(qǐng)求結(jié)果供大家使用就行了,多余的請(qǐng)求沒啥用,浪費(fèi)時(shí)間。所以這時(shí)候就需要shareReplay(1)了

6.Driver

drive方法只能在Driver序列中使用,Driver有以下特點(diǎn):1 Driver序列不允許發(fā)出error,2 Driver序列的監(jiān)聽只會(huì)在主線程中。所以Driver是轉(zhuǎn)為UI綁定量身打造的東西。以下情況你可以使用Driver替換BindTo:

7.map和flatMap何時(shí)使用

**map ** 函數(shù),接受一個(gè)R類型的序列,返回一個(gè)R類型的序列,還是原來(lái)的序列

**flatMap ** 函數(shù),接收一個(gè)O類型的序列,返回一個(gè)O.E類型的序列,也就是有原來(lái)序列里元素組成的新序列。

其實(shí)這里的map和flatMap在swift中的作用是一樣的。map函數(shù)可以對(duì)原有序列里面的事件元素進(jìn)行改造,返回的還是原來(lái)的序列。而flatMap對(duì)原有序列中的元素進(jìn)行改造和處理,每一個(gè)元素返回一個(gè)新的sequence,然后把每一個(gè)元素對(duì)應(yīng)的sequence合并為一個(gè)新的sequence序列。

對(duì)比:

map函數(shù)只能返回原來(lái)的那一個(gè)序列,里面的參數(shù)的返回值被當(dāng)做原來(lái)序列中所對(duì)應(yīng)的元素。

flatMap函數(shù)返回的是一個(gè)新的序列,將原來(lái)元素進(jìn)行了處理,返回這些處理后的元素組成的新序列

map函數(shù) + 合并函數(shù) = flatMap函數(shù)

UIBindingObserver

UIBindingObserver這個(gè)東西很有用的,創(chuàng)建我們自己的監(jiān)聽者,有時(shí)候RxCocoa(RxSwiftz中對(duì)UIKit的一個(gè)擴(kuò)展庫(kù))給的擴(kuò)展不夠我們使用,比如一個(gè)UITextField有個(gè)isEnabled屬性,我想把這個(gè)isEnabled變?yōu)橐粋€(gè)observer,我們可以這樣做:


extension Reactive where Base: UITextField {

    var inputEnabled: UIBindingObserver {

        return UIBindingObserver(UIElement: base) { textFiled, result in

            textFiled.isEnabled = result.isValid

        }

    }

}

自定義了一個(gè)inputEnabled Observer里面關(guān)聯(lián)的UITextField的isEnabled屬性。

感謝沸沸騰RxSwift入坑解讀-那些難以理解的細(xì)節(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容