2017-05-28 72 views
2

我想按顺序做一些动作,使用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>')

如何将此完整映射到单个?

回答

2

嗯...一个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>

+0

谢谢,我想尽可能多的和执行它作为你的建议一样。我会给Completable更多的机会,然后进行评估。 – Yasir

1

我不知道RxSwift,但在RxJava你可以到以下

repository.replace(with: value).andThen(Single.just(value)) 
相关问题