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 需要通过一个默认初始值来创建 当一个订阅者来订阅它的时候,这个订阅者会立即收到 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”
基本同 BehaviorSubject,只是订阅前的消息是无法获取到的。
Relay 对应Subject也有三种,Publish, Behavior, Replay Relay 只是对subject的包装,它并不遵循 ObserverType 协议,因此无法被 complete. 可以通过 accept 方法来抛出 onNext事件。