參考git
RxSwift中文文檔github
Github RxSwiftmarkdown
AsyncSubject 將在源 Observable 產生完成事件後,發出最後一個元素(僅僅只有最後一個元素),若是源 Observable 沒有發出任何元素,只有一個完成事件。那 AsyncSubject 也只有一個完成事件。oop
它會對隨後的觀察者發出最終元素。若是源 Observable 由於產生了一個 error 事件而停止, AsyncSubject 就不會發出任何元素,而是將這個 error 事件發送出來。spa
/*
AsyncSubject 將在源 Observable 產生完成事件後,發出最後一個元素(僅僅只有最後一個元素),若是源 Observable 沒有發出任何元素,只有一個完成事件。那 AsyncSubject 也只有一個完成事件。
它會對隨後的觀察者發出最終元素。若是源 Observable 由於產生了一個 error 事件而停止, AsyncSubject 就不會發出任何元素,而是將這個 error 事件發送出來。
*/
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
複製代碼
PublishSubject 將對觀察者發送訂閱後產生的元素,而在訂閱前發出的元素將不會發送給觀察者。若是你但願觀察者接收到全部的元素,你能夠經過使用 Observable 的 create 方法來建立 Observable,或者使用 ReplaySubject。code
若是源 Observable 由於產生了一個 error 事件而停止, PublishSubject 就不會發出任何元素,而是將這個 error 事件發送出來。orm
/*
PublishSubject 將對觀察者發送訂閱後產生的元素,而在訂閱前發出的元素將不會發送給觀察者。若是你但願觀察者接收到全部的元素,你能夠經過使用 Observable 的 create 方法來建立 Observable,或者使用 ReplaySubject。
若是源 Observable 由於產生了一個 error 事件而停止, PublishSubject 就不會發出任何元素,而是將這個 error 事件發送出來。
*/
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()
}
複製代碼
輸出:server
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
複製代碼
ReplaySubject 將對觀察者發送所有的元素,不管觀察者是什麼時候進行訂閱的。事件
這裏存在多個版本的 ReplaySubject,有的只會將最新的 n 個元素髮送給觀察者,有的只會將限制時間段內最新的元素髮送給觀察者。
若是把 ReplaySubject 看成觀察者來使用,注意不要在多個線程調用 onNext, onError 或 onCompleted。這樣會致使無序調用,將形成意想不到的結果。
/*
ReplaySubject 將對觀察者發送所有的元素,不管觀察者是什麼時候進行訂閱的。
這裏存在多個版本的 ReplaySubject,有的只會將最新的 n 個元素髮送給觀察者,有的只會將限制時間段內最新的元素髮送給觀察者。
若是把 ReplaySubject 看成觀察者來使用,注意不要在多個線程調用 onNext, onError 或 onCompleted。這樣會致使無序調用,將形成意想不到的結果。
*/
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(🐯)
複製代碼
/*
當觀察者對 BehaviorSubject 進行訂閱時,它會將源 Observable 中最新的元素髮送出來(若是不存在最新的元素,就發出默認元素)。而後將隨後產生的元素髮送出來。
若是源 Observable 由於產生了一個 error 事件而停止, BehaviorSubject 就不會發出任何元素,而是將這個 error 事件發送出來。
*/
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(🍐)
複製代碼