RxSwift學(xué)習(xí) - RxRelay

RxRelay

RxRelay 既是 可監(jiān)聽序列 也是 觀察者

他和 Subjects 相似,唯一的區(qū)別是不會(huì)接受 onErroronCompleted 這樣的終止事件。

在將非 Rx 樣式的 API 轉(zhuǎn)化為 Rx 樣式時(shí),Subjects 是非常好用的。不過(guò)一旦 Subjects 接收到了終止事件 onErroronCompleted。他就無(wú)法繼續(xù)工作了,也不會(huì)轉(zhuǎn)發(fā)后續(xù)任何事件。有些時(shí)候這是合理的,但在多數(shù)場(chǎng)景中這并不符合我們的預(yù)期。

在這些場(chǎng)景中一個(gè)更嚴(yán)謹(jǐn)?shù)淖龇ň褪牵瑒?chuàng)造一種特殊的 Subjects,這種 Subjects 不會(huì)接受終止事件。有了他,我們將 API 轉(zhuǎn)化為 Rx 樣式時(shí),就不必?fù)?dān)心一個(gè)意外的終止事件,導(dǎo)致后續(xù)事件轉(zhuǎn)發(fā)失效。

我們將這種特殊的 Subjects 稱作 RxRelay

PublishRelay

PublishRelay 就是 PublishSubject 去掉終止事件 onErroronCompleted

演示

let disposeBag = DisposeBag()
let relay = PublishRelay<String>()

relay
    .subscribe { print("Event:", $0) }
    .disposed(by: disposeBag)

relay.accept("??")
relay.accept("??")

輸出結(jié)果:

Event: next(??)
Event: next(??)

BehaviorRelay

BehaviorRelay 就是 BehaviorSubject 去掉終止事件 onErroronCompleted

演示

let disposeBag = DisposeBag()
let relay = BehaviorRelay(value: "??")

relay
    .subscribe { print("Event:", $0) }
    .disposed(by: disposeBag)

relay.accept("??")
relay.accept("??")

輸出結(jié)果:

Event: next(??)
Event: next(??)
Event: next(??)

BehaviorRelay 將取代 Variable,因?yàn)?Variable 很容易會(huì)引導(dǎo)我們使用命令式編程,而不是聲明式編程

參考鏈接

https://beeth0ven.github.io/RxSwift-Chinese-Documentation/content/recipes/rxrelay.html

備份原因

近期github訪問(wèn)不太穩(wěn)定,公司內(nèi)部也時(shí)而屏蔽github,遂把有些文章備份放到簡(jiǎn)書。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。