RxRelay
RxRelay 既是 可監(jiān)聽序列 也是 觀察者。
他和 Subjects 相似,唯一的區(qū)別是不會(huì)接受 onError
或 onCompleted
這樣的終止事件。
在將非 Rx 樣式的 API 轉(zhuǎn)化為 Rx 樣式時(shí),Subjects 是非常好用的。不過(guò)一旦 Subjects 接收到了終止事件 onError
或 onCompleted
。他就無(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 去掉終止事件 onError
或 onCompleted
。
演示
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 去掉終止事件 onError
或 onCompleted
。
演示
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)書。