RxSwift發(fā)送及訂閱 Subjects、Variables代碼示例
Subjects 介紹
1. Subjects 是訂閱者,也是Observable
訂閱者:它能動(dòng)態(tài)的接收新的值。
Observable: 當(dāng)Subjects有了新值后會(huì)通過(guò)Event將新值發(fā)出給他的所有訂閱者。
2. 常用的方法
- onNext(:):是on(.next(:)) 的簡(jiǎn)便寫(xiě)法。該方法相當(dāng)于 subject 接收到一個(gè).next 事件。
- onError(:):是on(.error(:))的簡(jiǎn)便寫(xiě)法。該方法相當(dāng)于 subject 接收到一個(gè).error 事件。
- onCompleted():是 on(.completed)的簡(jiǎn)便寫(xiě)法。該方法相當(dāng)于 subject 接收到一個(gè) .completed事件。
3. Subjects 有四種PublishSubject、BehaviorSubject、ReplaySubject、Variable
相同點(diǎn)
- 都是Observable,他們的訂閱者都能接收他們發(fā)出的新的Event
- 直到 Subject 發(fā)出 .complete 或者 .error 的 Event 后,該 Subject 便終結(jié)了,同時(shí)它也就不會(huì)再發(fā)出.next事件。
- 對(duì)于那些在Subject 終結(jié)后再訂閱他的訂閱者,也能收到 subject發(fā)出的一條.complete 或.error的event,告訴這個(gè)新的訂閱者它已經(jīng)終結(jié)了。
不同點(diǎn)
- PublishSubject
- 最普通的Subject,不需要初始值就能初始化。
- 他的訂閱者只能收到他們訂閱后的 Event。
let sub = PublishSubject<String>() sub.onNext("訂閱之前的不能接收到") sub.subscribe { event in print(event.element) //Optional("訂閱之后的可以接收到") //nil }.disposed(by: disposeBag) sub.onNext("訂閱之后的可以接收到") //結(jié)束 sub.onCompleted() /// 結(jié)束之后添加的訂閱能收到 completed sub.subscribe { event in print(event) } sub.onNext("結(jié)束后發(fā)的都收不到")
BehaviorSubject
需要一個(gè)默認(rèn)值初始化
當(dāng)一個(gè)訂閱者訂閱之后會(huì)立馬收到上一個(gè)Event,之后就是正常情況發(fā)一個(gè)收一個(gè)。
onCompleted()之后的訂閱者也只能收到Completed。
let sub = BehaviorSubject(value: "默認(rèn)值") sub.subscribe { event in print("訂閱1", event) }.disposed(by: disposeBag) sub.onNext("發(fā)送1") sub.subscribe { event in print("訂閱2", event) }.disposed(by: disposeBag) sub.onCompleted() sub.subscribe { event in print("訂閱3", event) }.disposed(by: disposeBag) 訂閱1 next(默認(rèn)值) 訂閱1 next(發(fā)送1) 訂閱2 next(發(fā)送1) 訂閱1 completed 訂閱2 completed 訂閱3 completed
ReplaySubject
創(chuàng)建的時(shí)候需要一個(gè)參數(shù)bufferSize設(shè)置記錄個(gè)數(shù)
新添加的訂閱會(huì)接收到之前發(fā)送的兩個(gè) Event,如果不足兩個(gè)就只接收一個(gè)。
如果超過(guò)兩個(gè)只接收最新的兩個(gè)。
如果訂閱時(shí)已經(jīng)結(jié)束除了會(huì)接收到最新的兩個(gè)Event外還有結(jié)束的complete或error。
let sub = ReplaySubject<String>.create(bufferSize: 2) sub.subscribe { event in print("訂閱1", event) }.disposed(by: disposeBag) sub.onNext("發(fā)送1") print("-------") sub.subscribe { event in print("訂閱2", event) }.disposed(by: disposeBag) sub.onNext("發(fā)送2") sub.onNext("發(fā)送3") sub.onNext("發(fā)送4") print("-------") sub.subscribe { event in print("訂閱3", event) }.disposed(by: disposeBag) sub.onCompleted() print("-------") /// 不僅會(huì)收到最后的兩個(gè) event 還有 Completed sub.subscribe { event in print("訂閱4", event) } 訂閱1 next(發(fā)送1) ------- 訂閱2 next(發(fā)送1) 訂閱1 next(發(fā)送2) 訂閱2 next(發(fā)送2) 訂閱1 next(發(fā)送3) 訂閱2 next(發(fā)送3) 訂閱1 next(發(fā)送4) 訂閱2 next(發(fā)送4) ------- 訂閱3 next(發(fā)送3) 訂閱3 next(發(fā)送4) 訂閱1 completed 訂閱2 completed 訂閱3 completed ------- 訂閱4 next(發(fā)送3) 訂閱4 next(發(fā)送4) 訂閱4 completed
BehaviorRelay
基本同 BehaviorSubject功能一樣,但是不能主動(dòng)調(diào)用onCompleted和error,會(huì)在BehaviorRelay釋放前調(diào)用
let sub = BehaviorRelay(value: "初始值") sub.subscribe { event in print("第一次訂閱", event) }.disposed(by: disposeBag) sub.accept("新值1") sub.subscribe { event in print("第二次訂閱", event) }.disposed(by: disposeBag)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Swift中static和class關(guān)鍵字的深入講解
這篇文章主要給大家介紹了關(guān)于Swift中static和class關(guān)鍵字的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Swift開(kāi)發(fā)中switch語(yǔ)句值綁定模式
本文給大家分享Swift開(kāi)發(fā)中switch語(yǔ)句值綁定模式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下2016-12-12Swift中使用可選類(lèi)型完美解決占位問(wèn)題
這篇文章主要介紹了Swift中使用可選類(lèi)型完美解決占位問(wèn)題,本文講解了為Dictionary增加objectsForKeys函數(shù)、Swift中更簡(jiǎn)便的方法、內(nèi)嵌可選類(lèi)型等內(nèi)容,需要的朋友可以參考下2015-05-05Swift實(shí)現(xiàn)Selection Sort選擇排序算法的實(shí)例講解
選擇排序是一種穩(wěn)定的排序算法,且實(shí)現(xiàn)代碼通常比冒泡排序要來(lái)的簡(jiǎn)單,這里我們就來(lái)看一下Swift實(shí)現(xiàn)Selection Sort選擇排序的實(shí)例講解2016-07-07Swift 如何讓ScrollView滾動(dòng)到具體某個(gè)位置
這篇文章主要介紹了Swift 如何讓ScrollView滾動(dòng)到具體某個(gè)位置,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Swift中循環(huán)語(yǔ)句中的轉(zhuǎn)移語(yǔ)句 break 和 continue
這篇文章主要介紹了Swift中循環(huán)語(yǔ)句中的轉(zhuǎn)移語(yǔ)句 break 和 continue,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的的朋友參考下2016-12-12