RxSwift發(fā)送及訂閱 Subjects、Variables代碼示例
Subjects 介紹
1. Subjects 是訂閱者,也是Observable
訂閱者:它能動態(tài)的接收新的值。
Observable: 當(dāng)Subjects有了新值后會通過Event將新值發(fā)出給他的所有訂閱者。
2. 常用的方法
- onNext(:):是on(.next(:)) 的簡便寫法。該方法相當(dāng)于 subject 接收到一個.next 事件。
- onError(:):是on(.error(:))的簡便寫法。該方法相當(dāng)于 subject 接收到一個.error 事件。
- onCompleted():是 on(.completed)的簡便寫法。該方法相當(dāng)于 subject 接收到一個 .completed事件。
3. Subjects 有四種PublishSubject、BehaviorSubject、ReplaySubject、Variable
相同點(diǎn)
- 都是Observable,他們的訂閱者都能接收他們發(fā)出的新的Event
- 直到 Subject 發(fā)出 .complete 或者 .error 的 Event 后,該 Subject 便終結(jié)了,同時它也就不會再發(fā)出.next事件。
- 對于那些在Subject 終結(jié)后再訂閱他的訂閱者,也能收到 subject發(fā)出的一條.complete 或.error的event,告訴這個新的訂閱者它已經(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
需要一個默認(rèn)值初始化
當(dāng)一個訂閱者訂閱之后會立馬收到上一個Event,之后就是正常情況發(fā)一個收一個。
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ù)bufferSize設(shè)置記錄個數(shù)
新添加的訂閱會接收到之前發(fā)送的兩個 Event,如果不足兩個就只接收一個。
如果超過兩個只接收最新的兩個。
如果訂閱時已經(jīng)結(jié)束除了會接收到最新的兩個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("-------")
/// 不僅會收到最后的兩個 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功能一樣,但是不能主動調(diào)用onCompleted和error,會在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)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Swift中static和class關(guān)鍵字的深入講解
這篇文章主要給大家介紹了關(guān)于Swift中static和class關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Swift實(shí)現(xiàn)Selection Sort選擇排序算法的實(shí)例講解
選擇排序是一種穩(wěn)定的排序算法,且實(shí)現(xiàn)代碼通常比冒泡排序要來的簡單,這里我們就來看一下Swift實(shí)現(xiàn)Selection Sort選擇排序的實(shí)例講解2016-07-07
Swift中循環(huán)語句中的轉(zhuǎn)移語句 break 和 continue
這篇文章主要介紹了Swift中循環(huán)語句中的轉(zhuǎn)移語句 break 和 continue,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的的朋友參考下2016-12-12

