2015-10-31 20 views
6

私はまだ反応の初心者であり、私は助けを求めています。2つを組み合わせるObservable <Void>s

func doA() -> Observable<Void> 
func doB() -> Observable<Void> 

enum Result { 
    case Success 
    case BFailed 
} 

func doIt() -> Observable<Result> { 

    // start both doA and doB. 
    // If both complete then emit .Success and complete 
    // If doA completes, but doB errors emit .BFailed and complete 
    // If both error then error 

} 

上記...初期機能doA()doB()ラップネットワークは、彼らは両方ともCompleteそして、一つの信号を発するとなりますので、呼び出します(またはError任意のNextイベントを放出せず。)doA()完了した場合、私は私が欲しいと思うものですdoB()のエラーが発生した場合は、doIt().BFailedを送信して終了します。

zipまたはcombineLatestを使用する必要があるように感じますが、それを行うとどのシーケンスが失敗するかをわかりません。私はまた、確かにcatchErrorがソリューションの一部であることを確信していますが、正確にどこに置くべきかわかりません。

-

私はそれについて考えていたように、私は、呼び出しが順次起こって大丈夫です。

Start doA() 
    if it completes start doB() 
     if it completes emit .Success 
     else emit .BFailed. 
    else forward the error. 

任意の助けてくれてありがとう:それはでも...

IE良いかもしれません。

答えて

0

私はswiftの構文がわからないことをお詫びしますので、私はC#で答えを書いています。コードは直接翻訳可能でなければなりません。

var query = 
    doA 
     .Materialize() 
     .Zip(doB.Materialize(), (ma, mb) => new { ma, mb }) 
     .Select(x => 
      x.ma.Kind == NotificationKind.OnError 
      || x.mb.Kind == NotificationKind.OnError 
       ? Result.BFailed 
       : Result.Success); 

基本的.Materialize()オペレータはタイプNotification<T>の観察のためにOnNextOnNext通知に、OnError、及びタイプTの観察のためにOnCompleted通知をオンにします。その後、.Zip(...)これらを実行し、必要な条件を確認してください。

+0

うーん...答えてくれてありがとう、しかしRxSwiftはマテリアライズメソッドを持っていません。少なくともまだ。 –

0

私は自分自身で答えを見つけたようです...確かに、この解決策は、完全なメッセージがdoA()またはdoB()から待つことはありません。代わりにonNextシグナルでResultオブジェクトを送出しますが、これらはネットワークコールなので、完了する前にonNextが1つだけ存在します。たぶん、私が完璧を待たなければならないと思ったのは、私が理解することが難しくなっていたことでした。

func doIt() -> Observable<Result> { 
    return doA().flatMap { 
     return doB().map { 
      .Success 
     } 
     .catchError { 
      just(.BFailed) 
     } 
    } 
} 
1

私は.flatMapLatest()があなたの観察可能なリクエストを連鎖していると信じています。

doFirst() 
.flatMapLatest({ [weak self] (firstResult) -> Observable<Result> in 
    // Assuming this doesn't fail and returns result on main scheduler, 
    // otherwise `catchError` and `observeOn(MainScheduler.instance)` can be used to correct this 
    // ... 
    // do something with result #1 
    // ... 
    return self?.doSecond() 
}).subscribeNext { [weak self] (secondResult) -> Void in 
    // ... 
    // do something with result #2 
    // ... 
}.addDisposableTo(disposeBag) 

ここではRXxwiftの.flatMapLatest() docです。

プロジェクト観測可能なシーケンスの新しいシーケンスに観察可能なシーケンスの各要素と、その後 のみ、最新の観測可能なシーケンスから値を生成する観測可能なシーケンスに観察可能なシーケンスの観察可能なシーケンスを変換。 map + switchLatestの演算子の組み合わせです。

関連する問題