在RxCocoa上,我想知道为什么PublishRelay没有像BehaviorRelay这样的asDriver()方法?当前,如果我想将publishRelay转换为Driver,我必须指定在发生错误的情况下返回的内容,鉴于中继无法生成错误,这似乎很奇怪。
答案 0 :(得分:5)
这两个...Relay
版本用于为不同的概念建模:
BehaviorRelay
代表州 PublishRelay
代表事件 重播状态很有意义,因此BehaviorRelay
重播其最新值。
重播事件的意义不大(否?),因此PublishRelay
不会重播其最新值。
考虑到这一点,当驱动程序使用 State 驱动应用程序时,将BehaviorRelay
转换为Driver
是有意义的。 BehaviorRelay
和Driver
的共享策略是在连接至少一个可观察对象的同时共享副作用并重播最新值。
PublishRelay
最好用Signal
表示,因此您可以使用Signal
来发射。在这种情况下,共享策略将不重播最新值,但在连接至少一个可观察对象时仍会共享副作用。
(我使用RxSwift存储库中@ freak4pc的great comment构建此答案)
答案 1 :(得分:2)
如果有人需要一个简单的例子:
publishRelay
.asDriver(onErrorDriveWith: Driver.empty())
.drive(onNext: { value in
})
.disposed(by: disposeBag)