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&lt;Void&gt; 而不是 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&lt;SomeType&gt;

【讨论】:

谢谢,我想了很多,并按照您的建议实施了它。我会给 Completable 更多的机会,然后进行评估?。

以上是关于RxSwift:将可完成映射到单个可观察?的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift:结合不同类型的可观察对象和映射结果

将可观察响应映射为 Angular 中的自定义接口数组

等待多个可观察请求完成使用 RXSwift

在 ViewController 中可观察到的单元测试 RxSwift

来自数组的 RxSwift 可观察对象序列

数据工作室如何将可重复列读取为单个记录的值?