RxSwift-subject使用

2019-08-06  本文已影响0人  May_Dobin

Subject 主要包括以下几类

public final class PublishSubject<Element>
    : Observable<Element>
    , SubjectType
    , Cancelable
    , ObserverType
    , SynchronizedUnsubscribeType {}

public final class BehaviorSubject<Element>
    : Observable<Element>
    , SubjectType
    , ObserverType
    , SynchronizedUnsubscribeType
    , Cancelable {}

public class ReplaySubject<Element>
    : Observable<Element>
    , SubjectType
    , ObserverType
    , Disposable {}

public final class AsyncSubject<Element>
    : Observable<Element>
    , SubjectType
    , ObserverType
    , SynchronizedUnsubscribeType{}

public final class Variable<Element> {

    public typealias E = Element

    private let _subject: BehaviorSubject<Element>

接下来介绍各自的特性和用法:

PublishSubject

//初始化一个PublishSubject ,Int类型的序列
 let publishSub = PublishSubject<Int>() 
        // 2:发送响应序列
        publishSub.onNext(1)
        // 3:订阅序列
        publishSub.subscribe { print("订阅到了:",$0)}
            .disposed(by: disposbag)
        // 再次发送响应
        publishSub.onNext(2)
        publishSub.onNext(3)

根据PublishSubject的特性,publishSub.onNext(1)不会响应,所以运行结果如下:

订阅到了: next(2)
订阅到了: next(3)

BehaviorSubject

        case .next(let element):
            self._element = element

重新赋值self._element,保存新的事件。

       // 1:创建序列
        let behaviorSub = BehaviorSubject.init(value: 100)
        behaviorSub.subscribe{ print("第一次订阅到了:",$0)}
            .disposed(by: disposbag)
        // 2:发送信号
        behaviorSub.onNext(2)
        behaviorSub.onNext(3)
        // 3:订阅序列
        behaviorSub.subscribe{ print("第二次订阅到了:",$0)}
            .disposed(by: disposbag)
        // 再次发送
        behaviorSub.onNext(4)
        behaviorSub.onNext(5)
        // 再次订阅
        behaviorSub.subscribe{ print("第三次订阅到了:",$0)}
            .disposed(by: disposbag)

根据BehaviorSubject的特性,运行结果:

//当前只有一个订阅者
第一次订阅到了: next(100)
第一次订阅到了: next(2)
//当前有两个订阅者
第一次订阅到了: next(3)
第二次订阅到了: next(3)
第一次订阅到了: next(4)
第二次订阅到了: next(4)
//当前有三个订阅者,依次打印
第一次订阅到了: next(5)
第二次订阅到了: next(5)
第三次订阅到了: next(5)

ReplaySubject

 // 1:创建序列
        let replaySub = ReplaySubject<Int>.create(bufferSize: 2)
        // 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)

lldb调试分析,第一个订阅者响应订阅前,保存的两次事件,值分别为34

运行结果:

//响应订阅前保存的两个事件
订阅到了: next(3)
订阅到了: next(4)
//订阅后,响应所有
订阅到了: next(7)
订阅到了: next(8)
订阅到了: next(9)

AsyncSubject

 // 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: "errorInfo", code: 111111, userInfo: nil))
        asynSub.onCompleted()

lldb调试,断点进入了在收到完成信号时,响应了最后一个保存的.onNext()事件

运行结果如下

订阅到了: next(4)
订阅到了: completed

BehaviorRelay

运行demo如下

        //1:创建序列
        let behaviorSubject = BehaviorRelay(value: 11111)
        //2:订阅信号
        behaviorSubject.subscribe(onNext: { (num) in
            print("订阅到了数值:\(num)")
        }).disposed(by: disposbag)
        //3:发送信号
        behaviorSubject.accept(22222)

运行结果

订阅到了数值:11111
订阅到了数值:22222

以上就是subject的特性和用法;

上一篇 下一篇

猜你喜欢

热点阅读