鲸落消零派selector

RxSwift4-Subjects介绍

2021-04-15  本文已影响0人  浮华_du

看了前面介绍的创建Observable的方式, 我们应该会想,在项目的实际使用中,大多数情况都是预先不知道序列值的.比如:我们要订阅文本框内容输入的变化.
这个时候,RxSwift为我们提供了Subjects,既是订阅者,也是 Observable.
Subjects分为四种类型: PublishSubject、BehaviorSubject、ReplaySubject、Variable(BehaviorRelay).我们分别来介绍下他们的用法及区别:

1. PublishSubject

let subject = PublishSubject<String>()
        subject.onNext("第一条消息")
        subject.subscribe(onNext: { string in
            print("第1次订阅:", string)
        }, onCompleted:{
            print("第1次订阅:onCompleted")
        }).disposed(by: disposeBag)
         
        subject.onNext("第二条消息")
         
        subject.subscribe(onNext: { string in
            print("第2次订阅:", string)
        }, onCompleted:{
            print("第2次订阅:onCompleted")
        }).disposed(by: disposeBag)
         
        subject.onNext("第三条消息")
         
        //让subject结束
        subject.onCompleted()
         
        //subject结束后会发出.next事件了。
        subject.onNext("第四条消息")
         
        subject.subscribe(onNext: { string in
            print("第3次订阅:", string)
        }, onCompleted:{
            print("第3次订阅:onCompleted")
        }).disposed(by: disposeBag)

//第1次订阅: 第二条消息
//第1次订阅: 第三条消息
//第2次订阅: 第三条消息
//第1次订阅:onCompleted
//第2次订阅:onCompleted
//第3次订阅:onCompleted

2. BehaviorSubject

let subject = BehaviorSubject(value: "初始消息")
        subject.onNext("第一条消息")
        subject.subscribe(onNext: { string in
            print("第1次订阅:", string)
        }, onCompleted:{
            print("第1次订阅:onCompleted")
        }).disposed(by: disposeBag)
         
        subject.onNext("第二条消息")
         
        subject.subscribe(onNext: { string in
            print("第2次订阅:", string)
        }, onCompleted:{
            print("第2次订阅:onCompleted")
        }).disposed(by: disposeBag)
         
        subject.onNext("第三条消息")
         
        //让subject结束
        subject.onCompleted()
         
        //subject完成后会发出.next事件了。
        subject.onNext("第四条消息")
         
        subject.subscribe(onNext: { string in
            print("第3次订阅:", string)
        }, onCompleted:{
            print("第3次订阅:onCompleted")
        }).disposed(by: disposeBag)

//第1次订阅: 第一条消息
//第1次订阅: 第二条消息
//第2次订阅: 第二条消息
//第1次订阅: 第三条消息
//第2次订阅: 第三条消息
//第1次订阅:onCompleted
//第2次订阅:onCompleted
//第3次订阅:onCompleted

3.ReplaySubject

例如下面代码, 一个 ReplaySubject 的 bufferSize 设置为 2,它发出了 4 个 .next 的 event("第五条消息"是在结束后.onNext的,不会发出),那么它会将后两个(最近的两个-bufferSize个数)event 给缓存起来。

此时如果有一个 subscriber 订阅了这个 ReplaySubject,那么这个 subscriber 就会立即收到前面缓存的两个.next 的 event。(例如:第三次订阅,收到了前面缓存的最近的两个消息2,3)及之后发出的4消息)

如果一个 subscriber 订阅已经结束的 ReplaySubject,除了会收到缓存的 .next 的 event外,还会收到那个终结的 .error 或者 .complete 的event。(第五次订阅)
//第一次订阅 总共收到了 1,+2,3,4消息
//第二次订阅 总共收到了 1,2,+3,4消息
//第三次订阅 总共收到了 2,3,+4消息
//第四次订阅 总共收到了 3,4+无消息
//第五次订阅 总共收到了 3,4+无消息

let subject = ReplaySubject<String>.create(bufferSize: 2)
        subject.onNext("第一条消息")
        subject.subscribe(onNext: { string in
            print("第1次订阅:", string)
        }, onCompleted:{
            print("第1次订阅:onCompleted")
        }).disposed(by: disposeBag)
         
        subject.onNext("第二条消息")
         
        subject.subscribe(onNext: { string in
            print("第2次订阅:", string)
        }, onCompleted:{
            print("第2次订阅:onCompleted")
        }).disposed(by: disposeBag)
         
        subject.onNext("第三条消息")
         
        subject.subscribe(onNext: { string in
            print("第3次订阅:", string)
        }, onCompleted:{
            print("第3次订阅:onCompleted")
        }).disposed(by: disposeBag)
        
        subject.onNext("第四条消息")
        
        subject.subscribe(onNext: { string in
            print("第4次订阅:", string)
        }, onCompleted:{
            print("第4次订阅:onCompleted")
        }).disposed(by: disposeBag)
        
        //让subject结束
        subject.onCompleted()
         
        //subject完成后就不会发出.next事件了。
        subject.onNext("第五条消息")
        
        subject.subscribe(onNext: { string in
            print("第5次订阅:", string)
        }, onCompleted:{
            print("第5次订阅:onCompleted")
        }).disposed(by: disposeBag)
//第1次订阅: 第一条消息
//第1次订阅: 第二条消息
//第2次订阅: 第一条消息
//第2次订阅: 第二条消息
//第1次订阅: 第三条消息
//第2次订阅: 第三条消息
//第3次订阅: 第二条消息
//第3次订阅: 第三条消息
//第1次订阅: 第四条消息
//第2次订阅: 第四条消息
//第3次订阅: 第四条消息
//第4次订阅: 第三条消息
//第4次订阅: 第四条消息
//第1次订阅:onCompleted
//第2次订阅:onCompleted
//第3次订阅:onCompleted
//第4次订阅:onCompleted
//第5次订阅: 第三条消息
//第5次订阅: 第四条消息
//第5次订阅:onCompleted


4. Variable => BehaviorRelay

 let variable = Variable("初始消息")
        
        variable.value = "第一条消息"
        //第1次订阅
        variable.asObservable().subscribe {
            print("第1次订阅:", $0)
        }.disposed(by: disposeBag)
        
        variable.value = "第二条消息"
        //第2次订阅
        variable.asObservable().subscribe {
            print("第2次订阅:", $0)
        }.disposed(by: disposeBag)
        
        variable.value = "第三条消息"
        variable.asObservable().subscribe {
            print("第3次订阅:", $0)
        }.disposed(by: disposeBag)

//ℹ️ [DEPRECATED] `Variable` is planned for future deprecation. Please consider `BehaviorRelay` as a replacement. Read more at: https://git.io/vNqvx
//第1次订阅: next(第一条消息)
//第1次订阅: next(第二条消息)
//第2次订阅: next(第二条消息)
//第1次订阅: next(第三条消息)
//第2次订阅: next(第三条消息)
//第3次订阅: next(第三条消息)
//第1次订阅: completed
//第2次订阅: completed
//第3次订阅: completed

5. BehaviorRelay

let subject = BehaviorRelay<String>(value: "初始值")
        subject.accept("第一条消息")
        subject.asObservable().subscribe {
            print("第1次订阅:", $0)
        }.disposed(by: disposeBag)
        subject.accept("第二条消息")

        subject.asObservable().subscribe {
            print("第2次订阅:", $0)
        }.disposed(by: disposeBag)
        subject.accept("第三条消息")

https://www.jianshu.com/p/def6965b0475
https://blog.csdn.net/qq_30963589/article/details/112171117

上一篇 下一篇

猜你喜欢

热点阅读