我正在尝试使用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/