2017-05-28 103 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)) 
相關問題