RxSwift:将可填充映射到单个可观察对象?

时间:2017-05-28 18:36:44

标签: ios rx-swift

我正在尝试按顺序执行一些操作,使用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行(flatMap)出错:

  

无法转换通话结果类型&#39; Observable&lt; _。E&gt;&#39;预期类型&#39; PrimitiveSequence&lt; SingleTrait,SomeType&gt;&#39; (又名&#39; PrimitiveSequence&lt; SingleTrait,SomeType&gt;&#39;)

如何将此完成表映射到单个?

2 个答案:

答案 0 :(得分:11)

我不确定RxSwift,但是在RxJava中你可以使用以下内容

repository.replace(with: value).andThen(Single.just(value))

答案 1 :(得分:5)

嗯......一个Completable永远不会发出一个元素,所以flatMap没有任何东西。 I.E.甚至在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>