PublishSubject、BehaviorSubject 和 ReplaySubject

RxSwift 里面,常见的 Subject 有PublishSubject、BehaviorSubject 和 ReplaySubject。它们的区别在于订阅者能否收到订阅前的事件。

一、 PublishSubject 发布事件 订阅者只能接收订阅后的事件,适合发送新的事件

 func publishFunc(){
        let publishSubject = PublishSubject<Int>()
        publishSubject.onNext(1)
        let observer1 = publishSubject.subscribe{event in print("observer1 \(event)")}
        observer1.disposed(by: disposeBag)
        
        publishSubject.onNext(2)
        let observer2 = publishSubject.subscribe{
            event in print("observer2 \(event)")
        }
        observer2.disposed(by: disposeBag)
        publishSubject.onNext(3)
        publishSubject.onCompleted()
        publishSubject.onNext(4)
    }

observer1 next(2)

observer1 next(3)

observer2 next(3)

observer1 completed

observer2 completed

二、BehaviorSubject 用于缓存一个事件,当订阅者订阅BehaviorSubject时,会马上收到该Subject里的最后一个事件

func behaviorFunc(){
        let publishSubject = BehaviorSubject<Int>(value: 1)
        publishSubject.onNext(1)
        let observer1 = publishSubject.subscribe{event in print("observer1 \(event)")}
        observer1.disposed(by: disposeBag)
        
        publishSubject.onNext(2)
        let observer2 = publishSubject.subscribe{
            event in print("observer2 \(event)")
        }
        observer2.disposed(by: disposeBag)
        publishSubject.onNext(3)
        publishSubject.onCompleted()
        publishSubject.onNext(4)
    }

observer1 next(1)

observer1 next(2)

observer2 next(2)

observer1 next(3)

observer2 next(3)

observer1 completed

observer2 completed

三、ReplaySubject 缓存 N 个事件

 

 func replayFunc(){
        let publishSubject = ReplaySubject<Int>.create(bufferSize: 2)
        publishSubject.onNext(1)
        publishSubject.onNext(2)
        let observer1 = publishSubject.subscribe{event in print("observer1 \(event)")}
        observer1.disposed(by: disposeBag)
        
        publishSubject.onNext(3)
        let observer2 = publishSubject.subscribe{
            event in print("observer2 \(event)")
        }
        observer2.disposed(by: disposeBag)
        publishSubject.onNext(4)
        publishSubject.onCompleted()
        publishSubject.onNext(5)
    }

observer1 next(1)

observer1 next(2)

observer1 next(3)

observer2 next(2)

observer2 next(3)

observer1 next(4)

observer2 next(4)

observer1 completed

observer2 completed

四、总结

如果需要把 Subject 传递给其他类型发送消息,例如在朋友圈时间轴列表页面把 Subject 传递给各个朋友圈子组件,然后接收来自子组件的事件。 这种情况我们一般会传递 PublishSubject,因为在传递前在主页面(如例子中的朋友圈时间轴页面)已经订阅了该 PublishSubject,子组件所发送事件,主页面都能收到。

BehaviorSubject 可用于状态管理,例如管理页面的加载状态,开始时可以把 BehaviorSubject 初始化为加载状态,一旦得到返回数据就可以转换为成功状态。

因为 BehaviorSubject 必须赋予初始值,但有些情况下,我们并没有初始化,如果使用 BehaviorSubject 必须把其存放的类型定义为 Optional 类型。为了避免使用 Optional,我们可以使用 bufferSize 为 1 的 ReplaySubject 来代替 BehaviorSubject。

Subject 和 Relay 都能用于中转事件,当中转的事件中没有completed或error时,我们都选择 Relay。

 

参考文献

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值