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

Yas*_*sir 5 ios rx-swift

我试图按顺序执行一些操作,使用RxSwift并且不确定如何使其工作.

问题是返回一个Singleobservable,其中成功/错误取决于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)
    }
}
Run Code Online (Sandbox Code Playgroud)

第4行出错(flatMap):

无法将调用结果类型'Observable <_.E>'转换为预期类型'PrimitiveSequence <SingleTrait,SomeType>'(又名'PrimitiveSequence <SingleTrait,SomeType>')

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

Wic*_*ket 14

我不确定RxSwift,但在RxJava中你可以做到以下几点

repository.replace(with: value).andThen(Single.just(value))
Run Code Online (Sandbox Code Playgroud)


Dan*_* T. 6

嗯......一个Completable永远不会发出一个元素,所以没有什么可以平面映射到.IE甚至.andThen在Completable上使用运算符也没有意义.你唯一可以做的就是订阅它.

因此,您需要像这样实现您的方法:

func doSomething(with value: SomeType) -> Single<SomeType> {
    return repository.replace(with: value)
        .andThen(Single.just(value))
}
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用过去没有发出值的Observables,在这些新奇的类型之前,我总是觉得它们很痛苦.如果我是你,我会转换你的flatMap方法replace而不是a Single<Void>.即:

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))
            })
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你这样做,那么你可以简单地:

func replace(with value: SomeType) -> Single<Void> 
Run Code Online (Sandbox Code Playgroud)

当然,如果你能做到这一点,那么你也可以Completable自己回归replace(with:).