參考
1. AsyncSubject
AsyncSubject 將在源 Observable 產(chǎn)生完成事件后砍鸠,發(fā)出最后一個(gè)元素(僅僅只有最后一個(gè)元素),如果源 Observable 沒有發(fā)出任何元素徘意,只有一個(gè)完成事件装盯。那 AsyncSubject 也只有一個(gè)完成事件脖母。
它會(huì)對(duì)隨后的觀察者發(fā)出最終元素。如果源 Observable 因?yàn)楫a(chǎn)生了一個(gè) error 事件而中止, AsyncSubject 就不會(huì)發(fā)出任何元素嗜逻,而是將這個(gè) error 事件發(fā)送出來动知。
/*
AsyncSubject 將在源 Observable 產(chǎn)生完成事件后皿伺,發(fā)出最后一個(gè)元素(僅僅只有最后一個(gè)元素),如果源 Observable 沒有發(fā)出任何元素盒粮,只有一個(gè)完成事件鸵鸥。那 AsyncSubject 也只有一個(gè)完成事件。
它會(huì)對(duì)隨后的觀察者發(fā)出最終元素丹皱。如果源 Observable 因?yàn)楫a(chǎn)生了一個(gè) error 事件而中止妒穴, AsyncSubject 就不會(huì)發(fā)出任何元素宋税,而是將這個(gè) error 事件發(fā)送出來。
*/
func setupAsyncSubject() {
let subject = AsyncSubject<String>()
subject
.subscribe {
print("AsyncSubject 1 Event :",$0)
}
.disposed(by: disposeBag)
subject.onNext("??")
subject.onNext("??")
subject.onNext("??")
subject.onNext("??")
subject.onCompleted()
}
輸出:
AsyncSubject 1 Event : next(??)
AsyncSubject 1 Event : completed
2. PublishSubject
PublishSubject 將對(duì)觀察者發(fā)送訂閱后產(chǎn)生的元素宰翅,而在訂閱前發(fā)出的元素將不會(huì)發(fā)送給觀察者弃甥。如果你希望觀察者接收到所有的元素,你可以通過使用 Observable 的 create 方法來創(chuàng)建 Observable汁讼,或者使用 ReplaySubject淆攻。
如果源 Observable 因?yàn)楫a(chǎn)生了一個(gè) error 事件而中止, PublishSubject 就不會(huì)發(fā)出任何元素嘿架,而是將這個(gè) error 事件發(fā)送出來瓶珊。
/*
PublishSubject 將對(duì)觀察者發(fā)送訂閱后產(chǎn)生的元素,而在訂閱前發(fā)出的元素將不會(huì)發(fā)送給觀察者耸彪。如果你希望觀察者接收到所有的元素伞芹,你可以通過使用 Observable 的 create 方法來創(chuàng)建 Observable,或者使用 ReplaySubject蝉娜。
如果源 Observable 因?yàn)楫a(chǎn)生了一個(gè) error 事件而中止唱较, PublishSubject 就不會(huì)發(fā)出任何元素,而是將這個(gè) error 事件發(fā)送出來召川。
*/
func setupPublishSubject() {
let subject = PublishSubject<String>()
subject
.subscribe {print("PublishSubject 1 Event: ", $0)}
.disposed(by: disposeBag)
subject.onNext("??")
subject.onNext("??")
subject
.subscribe {print("PublishSubject 2 Event: ", $0)}
.disposed(by: disposeBag)
subject.onNext("??")
subject.onNext("??")
subject.onCompleted()
}
輸出:
PublishSubject 1 Event: next(??)
PublishSubject 1 Event: next(??)
PublishSubject 1 Event: next(??)
PublishSubject 2 Event: next(??)
PublishSubject 1 Event: next(??)
PublishSubject 2 Event: next(??)
PublishSubject 1 Event: completed
PublishSubject 2 Event: completed
3. ReplaySubject
ReplaySubject 將對(duì)觀察者發(fā)送全部的元素南缓,無論觀察者是何時(shí)進(jìn)行訂閱的。
這里存在多個(gè)版本的 ReplaySubject荧呐,有的只會(huì)將最新的 n 個(gè)元素發(fā)送給觀察者汉形,有的只會(huì)將限制時(shí)間段內(nèi)最新的元素發(fā)送給觀察者。
如果把 ReplaySubject 當(dāng)作觀察者來使用倍阐,注意不要在多個(gè)線程調(diào)用 onNext, onError 或 onCompleted概疆。這樣會(huì)導(dǎo)致無序調(diào)用,將造成意想不到的結(jié)果峰搪。
/*
ReplaySubject 將對(duì)觀察者發(fā)送全部的元素岔冀,無論觀察者是何時(shí)進(jìn)行訂閱的。
這里存在多個(gè)版本的 ReplaySubject概耻,有的只會(huì)將最新的 n 個(gè)元素發(fā)送給觀察者使套,有的只會(huì)將限制時(shí)間段內(nèi)最新的元素發(fā)送給觀察者。
如果把 ReplaySubject 當(dāng)作觀察者來使用咐蚯,注意不要在多個(gè)線程調(diào)用 onNext, onError 或 onCompleted童漩。這樣會(huì)導(dǎo)致無序調(diào)用,將造成意想不到的結(jié)果春锋。
*/
func setupReplaySubject() {
/// Creates new instance of `ReplaySubject` that replays at most `bufferSize` last elements of sequence.
///
/// - parameter bufferSize: Maximal number of elements to replay to observer after subscription.
/// - returns: New instance of replay subject.
let subject = ReplaySubject<String>.create(bufferSize: 1)
subject
.subscribe{print("ReplaySubject 1 Event: ", $0)}
.disposed(by: disposeBag)
subject.onNext("??")
subject.onNext("??")
subject
.subscribe{ print("ReplaySubject 2 Event: ", $0)}
.disposed(by: disposeBag)
subject.onNext("??")
subject.onNext("??")
}
輸出:
ReplaySubject 1 Event: next(??)
ReplaySubject 1 Event: next(??)
ReplaySubject 2 Event: next(??)
ReplaySubject 1 Event: next(??)
ReplaySubject 2 Event: next(??)
ReplaySubject 1 Event: next(??)
ReplaySubject 2 Event: next(??)
4. BehaviorSubject
/*
當(dāng)觀察者對(duì) BehaviorSubject 進(jìn)行訂閱時(shí)矫膨,它會(huì)將源 Observable 中最新的元素發(fā)送出來(如果不存在最新的元素,就發(fā)出默認(rèn)元素)。然后將隨后產(chǎn)生的元素發(fā)送出來侧馅。
如果源 Observable 因?yàn)楫a(chǎn)生了一個(gè) error 事件而中止危尿, BehaviorSubject 就不會(huì)發(fā)出任何元素,而是將這個(gè) error 事件發(fā)送出來馁痴。
*/
func setupBehavioreSubject() {
let subject = BehaviorSubject(value: "??")
subject
.subscribe{ print("BehaviorSubject 1 Event: ", $0)}
.disposed(by: disposeBag)
subject.onNext("??")
subject.onNext("??")
subject
.subscribe{ print("BehaviorSubject 2 Event: ", $0)}
.disposed(by: disposeBag)
subject.onNext("???")
subject.onNext("???")
subject
.subscribe{ print("BehaviorSubject 3 Event: ", $0)}
.disposed(by: disposeBag)
subject.onNext("??")
subject.onNext("??")
}
輸出:
BehaviorSubject 1 Event: next(??)
BehaviorSubject 1 Event: next(??)
BehaviorSubject 1 Event: next(??)
BehaviorSubject 2 Event: next(??)
BehaviorSubject 1 Event: next(???)
BehaviorSubject 2 Event: next(???)
BehaviorSubject 1 Event: next(???)
BehaviorSubject 2 Event: next(???)
BehaviorSubject 3 Event: next(???)
BehaviorSubject 1 Event: next(??)
BehaviorSubject 2 Event: next(??)
BehaviorSubject 3 Event: next(??)
BehaviorSubject 1 Event: next(??)
BehaviorSubject 2 Event: next(??)
BehaviorSubject 3 Event: next(??)