RxSwift:将可完成映射到单个可观察?
Posted
技术标签:
【中文标题】RxSwift:将可完成映射到单个可观察?【英文标题】:RxSwift: Mapping a completable to single observable? 【发布时间】:2017-05-28 18:36:43 【问题描述】:我正在尝试使用 RxSwift 依次执行几个操作,但不确定如何使其工作。
问题是返回一个Single
observable,其中成功/错误取决于Completable
调用是成功还是失败。
我的代码尝试大致如下:
func doSomething(with value: SomeType) -> Single<SomeType>
return repository.replace(with: value) // replace() returns a completable
.asObservable()
.flatMap () -> Single<SomeType> in
return Single.just(value)
第 4 行错误(平面地图):
无法将调用结果类型“Observable<_.e>”转换为预期类型“PrimitiveSequence”(又名“PrimitiveSequence”)
如何将这个可完成映射到单个?
【问题讨论】:
【参考方案1】:我不确定 RxSwift,但在 RxJava 中你可以做到以下几点
repository.replace(with: value).andThen(Single.just(value))
【讨论】:
【参考方案2】:在我回答这个问题几个月后,Completable 类型中添加了一个新的运算符。 .andThen
。使用它使这段代码更简单:
func doSomething(with value: SomeType) -> Single<SomeType>
return repository.replace(with: value)
.andThen(Single.just(value))
原始答案如下:
嗯... Completable 永远不会发出元素,因此 flatMap 没有什么可做的。 IE。甚至在 Completable 上使用 flatMap
运算符也没有意义。你唯一能用它做的就是订阅它。
因此,您需要像这样实现您的方法:
func doSomething(with value: SomeType) -> Single<SomeType>
return Single<SomeType>.create observer in
return repository.replace(with: value)
.subscribe(onCompleted:
observer(.success(value))
, onError:
observer(.error($0))
)
在这些新奇类型之前,我曾尝试使用过去不发出值的 Observable,但我一直觉得它们很痛苦。如果我是你,我会将你的 replace
方法转换为返回 Single<Void>
而不是 Completable
。即:
func replace(with value: SomeType) -> Single<Void>
如果你这样做,那么你可以简单地:
func doSomething(with value: SomeType) -> Single<SomeType>
return repository.replace(with: value).map value
当然,如果你能做到这一点,那么你不妨让replace(with:)
本身返回一个Single<SomeType>
。
【讨论】:
谢谢,我想了很多,并按照您的建议实施了它。我会给 Completable 更多的机会,然后进行评估?。以上是关于RxSwift:将可完成映射到单个可观察?的主要内容,如果未能解决你的问题,请参考以下文章