2017-05-28 4 views
2

J'essaie de faire quelques actions en séquence, en utilisant RxSwift et je ne sais pas comment le faire fonctionner.RxSwift: mappage d'un exécutable à un seul observable?

Le problème est renvoyant un Single observable, où le succès/erreur dépend si un appel Completable réussit ou échoue.

Ma tentative de code ressemble à peu près comme ceci:

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) 
    } 
} 

Erreur sur la ligne 4 (flatMap):

Impossible de convertir le type de résultat d'appel 'Observable < _.E>' type prévu ' PrimitiveSequence < SingleTrait, UnType> »(alias 'PrimitiveSequence < SingleTrait, UnType>')

Comment est-ce que je peux mapper ce complétable à un seul?

Répondre

2

Hmm ... A Completable n'émet jamais d'élément donc il n'y a rien à faire avec flatmap. C'EST À DIRE. cela n'a pas de sens d'utiliser même l'opérateur flatMap sur un Completable. La seule chose que vous pouvez vraiment faire est d'y adhérer.

Par conséquent, vous devez mettre en œuvre votre méthode comme ceci:

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)) 
      }) 
    } 
} 

J'ai essayé de travailler avec Observables qui n'émettent pas de valeurs dans le passé, avant que ces types dernier cri, et je l'ai toujours les a trouvés être une douleur. Si j'étais vous, je convertirais votre méthode replace pour retourner un Single<Void> au lieu d'un Completable. i.e. .:

func replace(with value: SomeType) -> Single<Void> 

Si vous faites cela, vous pouvez simplement:

func doSomething(with value: SomeType) -> Single<SomeType> { 
    return repository.replace(with: value).map { value } 
} 

Bien sûr, si vous pouvez le faire, alors vous pourriez aussi bien avoir replace(with:) lui-même un retour Single<SomeType>.

+0

Merci, je me suis dit autant et mis en œuvre la même chose que vous suggérez. Je vais donner quelques chances supplémentaires à Completable, puis faire une évaluation. – Yasir

1

Je ne suis pas sûr de RxSwift, mais RxJava vous pourriez les suivants

repository.replace(with: value).andThen(Single.just(value))