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
复制代码

相关文章
相关标签/搜索