RxSwift 的Subject

ReplaySubject

ReplaySubject 在创建时候需要设置一个 bufferSize,表示它对于它发送过的 event 的缓存个数。 比如一个 ReplaySubject 的 bufferSize 设置为 2,它发出了 3 个 .next 的 event,那么它会将后两个(最近的两个)event 给缓存起来。此时如果有一个 subscriber 订阅了这个 ReplaySubject,那么这个 subscriber 就会立即收到前面缓存的两个.next 的 event。 如果一个 subscriber 订阅已经结束的 ReplaySubject,除了会收到缓存的 .next 的 event外,还会收到那个终结的 .error 或者 .complete 的event。 样例代码:

let subject = ReplaySubject<String>.create(bufferSize: 2)
subject.onNext(“1”)
subject.onNext(“2”)
subject.onNext(“3”)
//第一次订阅,会收到 2 和 3 事件
        subject.subscribe(onNext: { (event) in
            print(event)
        }, onError: { (error) in
            print(error)
        }, onCompleted: {
            print("这是一个 完成")
        }) {
            print("销毁了")
        }.disposed(by: bag)
subject.onCompleted()   //设置ReplaySubject为完成状态
//第二次订阅,会立刻收到 2 和3事件,以及 completed事件
subject.subscribe(onNext: { (event) in
            print(event)
        }, onError: { (error) in
            print(error)
        }, onCompleted: {
            print("完成之后的订阅完成")
        }) {
            print("完成之后销毁了")
        }.disposed(by: bag)

BehaviorSubject

BehaviorSubject 需要通过一个默认初始值来创建 当一个订阅者来订阅它的时候,这个订阅者会立即收到 BehaviorSubjects 上一个发出的event。之后就跟正常的情况一样,它也会接收到 BehaviorSubject 之后发出的新的 event 这个地方正好区别了PublishSubject 订阅之前发出信号无法监听。 注意,如果BehaviorSubject complete了,那么再次订阅,是无法获取到上一次的next 事件的,而且再用此 Subject发送事件,也无效了,只会立刻获取到complete事件(说明 BehaviorSubject 是无buffer的)

let subject1 = BehaviorSubject(value: “1”)
        subject1.subscribe(onNext: { (event) in
            print(event)
        } , onCompleted: {
            print("completed 1")
        }) {
            print("销毁了1")
        }.disposed(by: bag)
        
        subject1.onNext(“2”)
        subject1.onCompleted()	//标定该subject结束了

        subject1.onNext(“3”) //因为已经结束,因此此事件发送无效
//再次订阅,也只能获取到 complete事件了
        subject1.subscribe(onNext: { (event) in
            print(event)
        } , onCompleted: {
            print("completed 2")
        }) {
            print("销毁了2")
        }.disposed(by: bag)

打印结果为 1, 2, “completed 1”, “completed 2”

PublishSubject

基本同 BehaviorSubject,只是订阅前的消息是无法获取到的。

补充知识点: Relay 和 Subject

Relay 对应Subject也有三种,Publish, Behavior, Replay Relay 只是对subject的包装,它并不遵循 ObserverType 协议,因此无法被 complete. 可以通过 accept 方法来抛出 onNext事件。