RxSwift:映射一个可完成的单观察?
问题描述:
我想按顺序做一些动作,使用RxSwift,但我不确定如何让它工作。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):
无法转换调用结果类型 '可观察< _.E>' 预期类型“ PrimitiveSequence < SingleTrait,SOMETYPE>”(又名 'PrimitiveSequence < SingleTrait,SOMETYPE>')
如何将此完整映射到单个?
答
嗯...一个Completable从来没有发出一个元素,所以没有什么可以平面地图。 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))
})
}
}
我已经试过在过去,这些新奇的类型在那之前不会排放值,观测量的工作,我一直发现他们是一种痛苦。如果我是你,我会转换你的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>
。
答
我不知道RxSwift,但在RxJava你可以到以下
repository.replace(with: value).andThen(Single.just(value))
谢谢,我想尽可能多的和执行它作为你的建议一样。我会给Completable更多的机会,然后进行评估。 – Yasir