iOS - RxSwift - Subject

參考git

RxSwift中文文檔github

Github RxSwiftmarkdown

1. AsyncSubject

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
複製代碼

2. PublishSubject

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
複製代碼

3. ReplaySubject

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(🐯)

複製代碼

4. BehaviorSubject

/*
     當觀察者對 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(🍐)
複製代碼
相關文章
相關標籤/搜索