RxCocoa - 为啥 PublishRelay 没有 asDriver() 方法?

Posted

技术标签:

【中文标题】RxCocoa - 为啥 PublishRelay 没有 asDriver() 方法?【英文标题】:RxCocoa - Why doesn't PublishRelay have an asDriver() method?RxCocoa - 为什么 PublishRelay 没有 asDriver() 方法? 【发布时间】:2019-01-29 17:06:07 【问题描述】:

在 RxCocoa 上,我想知道为什么 PublishRelay 没有像 BehaviorRelay 这样的 asDriver() 方法?目前,如果我想将 publishRelay 转换为驱动程序,我必须指定在出现错误时返回的内容,这看起来很奇怪,因为继电器无法生成错误...

【问题讨论】:

【参考方案1】:

这两个版本的...Relay 用于对不同的概念进行建模:

BehaviorRelay 代表状态 PublishRelay 代表事件

重播 State 是有意义的,因此BehaviorRelay 重播其最新值。

重播事件没有意义(不是?),因此PublishRelay 不会重播其最新值。

考虑到这一点,将BehaviorRelay 转换为Driver 是有意义的,因为驱动程序使用State 驱动应用程序。 BehaviorRelayDriver 的共享策略是在至少连接一个 observable 时共享副作用并重播最新值

PublishRelay 更好地由Signal 表示,因此您可能可以使用Signal 来发射。这种情况下的共享策略是重播最新的值,但在至少连接一个 observable 时仍然共享副作用。

(我使用来自 RxSwift 存储库上的@freak4pc 的great comment 构建这个答案)

【讨论】:

非常感谢您的评论。你是对的。我错过了Driver打算重播最后一场比赛的部分!我现在更有意义了:)【参考方案2】:

如果有人需要一个简单的例子:

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

            )
            .disposed(by: disposeBag)

【讨论】:

以上是关于RxCocoa - 为啥 PublishRelay 没有 asDriver() 方法?的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift 中的 PublishSubject 和 PublishRelay 有啥区别?

如何从泛型observable订阅PublishRelay?

如何使用 RxCocoa 将图像设置为 UIButton

RxCocoa 中的 UICollectionViewDelegate

处理 UITableView 绑定中的连接错误(Moya、RxSwift、RxCocoa)

RxSwift、RxCocoa 和 UITableview