我正在尝试使用RxSwift依次执行几个操作,并且不确定如何使它工作。

问题是返回一个可观察到的Single,其中成功/错误取决于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)发生错误:



我该如何将此补全映射为单个?

最佳答案

在我回答了这个问题仅几个月之后,一个新的运算符被添加到了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))
            })
    }
}

在这些新奇的类型之前,我尝试过使用过去不发出值的Observables,但我一直觉得它们很痛苦。如果我是您,我将转换您的replace方法以返回Single<Void>而不是Completable。 IE。:
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>

关于ios - RxSwift : Mapping a completable to single observable?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44230712/

10-10 21:07