RxSwift之Subject

當咱們須要建立一個 Observable的時候,要預先將要發送的信號或數據準備好,等到有subscribe時再將數據經過 onXX發出去。 可是,當須要Observable 在運行時能動態地獲取一個新的數據時候,再經過onXX發送給訂閱者,以實現「聯動」的效果。咱們就要用到了Subject。bash

Subject介紹

SubjectSubject是一個代理,它是特殊的序列,既是Observer,同時又是Observable Subject分爲:PublishSubject、BehaviorSubject、ReplaySubject、AsyncSubject、BehaviorRelaydom

PublishSubject

-PublishSubject的建立須要定義類型,但不須要初始值。 -PublishSubject的訂閱序列只能接收到subscribe以後的onXX事件,不能接收到subscribe以前的onXX事件。ui

// 1:初始化序列
        let publishSub = PublishSubject<Int>()
        //初始化一個PublishSubject 裝着Int類型的序列
        // 2:發送響應序列
        publishSub.onNext(1)
        // 3:訂閱序列
        publishSub.subscribe { print("訂閱到了:",$0)}
            .disposed(by: disposbag)
        // 再次發送響應
        publishSub.onNext(2)
        publishSub.onNext(3)
複製代碼
訂閱到了: next(2)
訂閱到了: next(3)
複製代碼

BehaviorSubject

-BehaviorSubject 須要的建立須要給定一個初始的默認值,第一次subscribe以前若是沒有發送onXX事件,那麼訂閱到的就是這個初始的默認值。若是第一次subscribe以前發送了onXX事件,那麼會把初始值覆蓋掉。 -若是subscribe以前發送多個onXX事件,只會保留臨近的一個; subscribe以後發送的onXX事件都會執行spa

// 1:建立序列
        let behaviorSub = BehaviorSubject.init(value: 100)
        // 2:發送信號
        behaviorSub.onNext(1)
        behaviorSub.onNext(2)
        // 3:訂閱序列
        behaviorSub.subscribe{ print("第一次訂閱到了:",$0)}
            .disposed(by: disposbag)
        // 再次發送
        behaviorSub.onNext(3)
        behaviorSub.onNext(4)
        // 再次訂閱
        behaviorSub.subscribe{ print("第二次訂閱到了:",$0)}
            .disposed(by: disposbag)
複製代碼
第一次訂閱到了: next(2)
第一次訂閱到了: next(3)
第一次訂閱到了: next(4)
第二次訂閱到了: next(4)
複製代碼

ReplaySubject

若是初始化設置bufferSize,那麼連續發送信號,而subscribe可以訂閱到的最大數量爲bufferSize3d

設置bufferSize代理

// 1:建立序列
        let replaySub = ReplaySubject<Int>.create(bufferSize: 2)
        // 2:發送信號
        replaySub.onNext(1)
        replaySub.onNext(2)
        replaySub.onNext(3)
        replaySub.onNext(4)

        // 3:訂閱序列
        replaySub.subscribe{ print("訂閱到了:",$0)}
            .disposed(by: disposbag)
        // 再次發送
        replaySub.onNext(7)
        replaySub.onNext(8)
        replaySub.onNext(9)
複製代碼
訂閱到了: next(3)
訂閱到了: next(4)
訂閱到了: next(7)
訂閱到了: next(8)
訂閱到了: next(9)
複製代碼

createUnbounded,不設置bufferSizecode

// 1:建立序列
        let replaySub = ReplaySubject<Int>.createUnbounded()
        // 2:發送信號
        replaySub.onNext(1)
        replaySub.onNext(2)
        replaySub.onNext(3)
        replaySub.onNext(4)

        // 3:訂閱序列
        replaySub.subscribe{ print("訂閱到了:",$0)}
            .disposed(by: disposbag)
        // 再次發送
        replaySub.onNext(7)
        replaySub.onNext(8)
        replaySub.onNext(9)
複製代碼
訂閱到了: next(1)
訂閱到了: next(2)
訂閱到了: next(3)
訂閱到了: next(4)
訂閱到了: next(7)
訂閱到了: next(8)
訂閱到了: next(9)
複製代碼

AsyncSubject

遇到onError的話,onError以前的onXX發送所有做廢cdn

// 1:建立序列
        let asynSub = AsyncSubject<Int>.init()
        // 2:發送信號
        asynSub.onNext(1)
        asynSub.onNext(2)
        // 3:訂閱序列
        asynSub.subscribe{ print("訂閱到了:",$0)}
            .disposed(by: disposbag)
        // 再次發送
        asynSub.onNext(3)
        asynSub.onNext(4)
        asynSub.onError(NSError.init(domain: "EpisodeError", code: 10086, userInfo: nil))
        asynSub.onCompleted()
複製代碼
訂閱到了: error(Error Domain=EpisodeError Code=10086 "(null)")
複製代碼

BehaviorRelay

BehaviorRelay替代Variable, 無需手寫 on(event)事件,只需給屬性賦值便可獲取事件響應。server

// 1:建立序列
        let behaviorRelay = BehaviorRelay(value: 1)
        // 3:訂閱序列
        behaviorRelay.subscribe(onNext: { (num) in
            print(num)
        })
        .disposed(by: disposbag)
        print("accept前:\(behaviorRelay.value)")
        // 2:發送信號
        behaviorRelay.accept(100)
        print("accept後:\(behaviorRelay.value)")
複製代碼
1
accept前:1
100
accept後:100
訂閱到了: completed
複製代碼

相關文章
相關標籤/搜索