RxCocoa - Why doesn't PublishRelay have an asDriver() method?

Those two versions of ...Relay are used to model different concepts:

  • BehaviorRelay represents State
  • PublishRelay represents Events

It makes sense to replay State, hence BehaviorRelay replays its latest value.

It makes less (no?) sense to replay Events, hence PublishRelay does not replay its latest value.

With this in mind, it makes sens for a BehaviorRelay to be transformable to Driver, as a driver drives the application using State. The sharing strategy for BehaviorRelay and Driver is to share side effects and replay the latest value while at least one observable is connected.

A PublishRelay is better represented by a Signal, so you probably could use a Signal to emit to. The sharing strategy in this case is will not replay the latest value, but still share the side effects while at least one observable is connected.

(I build this answer using this great comment from @freak4pc on RxSwift's repository)


If someone need a simple example:

publishRelay
            .asDriver(onErrorDriveWith: Driver.empty())
            .drive(onNext: { value in

            })
            .disposed(by: disposeBag)