我正在尝试按顺序执行一些操作,使用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;)
如何将此完成表映射到单个?
答案 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>
。