我试图按顺序执行一些操作,使用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)
嗯......一个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:).
| 归档时间: |
|
| 查看次数: |
9761 次 |
| 最近记录: |