2017-05-28 3 views
2

Ich versuche ein paar Aktionen nacheinander mit RxSwift zu machen und bin mir nicht sicher, wie es funktioniert.RxSwift: Mapping eine vollständige zu einzelnen beobachtbaren?

Das Problem ist eine Single Observable zurück, wo der Erfolg/Fehler davon abhängt, ob ein Completable Aufruf erfolgreich ist oder fehlschlägt.

Mein Code Versuch sieht ungefähr wie folgt aus:

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

Fehler in Zeile 4 (flatMap):

Kann nicht Anrufergebnistyp umwandeln 'beobachtbar < _.E>' zu den erwarteten Typ ' PrimitiveSequence < SingleTrait, Sometype>‘(auch bekannt als 'PrimitiveSequence < SingleTrait, Sometype>')

Wie kann ich diese Complectable auf eine Single abbilden?

Antwort

2

Hmm ... Eine Completable emittiert nie ein Element, also gibt es nichts, was zu FlatMap. I.E. Es macht keinen Sinn, den Operator flatMap auf einem Completable zu verwenden. Das einzige, was Sie wirklich damit tun können, ist es zu abonnieren.

Daher müssen Sie Ihre Methode wie folgt umzusetzen:

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

Ich habe versucht, mit Observable zu arbeiten, die vor diesen neumodischen Arten keine Werte in der Vergangenheit emittieren, und ich habe immer fand sie ein Schmerz. Wenn ich Sie wäre, würde ich Ihre replace Methode konvertieren, um eine Single<Void> anstelle einer Completable zurückgeben. d.h .:

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

Wenn Sie das tun, dann können Sie einfach:

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

Natürlich, wenn Sie das tun können, dann könnten Sie haben gut replace(with:) selbst eine Single<SomeType> zurück.

+0

Danke, ich so viel gedacht und umgesetzt es das gleiche wie Sie vorgeschlagen. Ich werde Completable noch ein paar Chancen geben und dann eine Bewertung abgeben. – Yasir

1

Ich bin nicht sicher RxSwift, aber in RxJava konnte man auf die folgenden

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