0

私はproducerAproducerAがエラーをスローした場合、エラーを処理し、そこに停止に成功しても実行されたときに、2つの生産者AとB producerBのみ実行する必要があります持っている以下のシナリオ で動作するようにしようとしています。だから私はこのようなことを試みた。 producerBproducerAがエラーをスローした場合でも実行のようproducerAがエラーをスローしない場合にのみproducerBを実行する方法は?

producerA.flatMapError { 
    // handle error and stop right here 
}.then(producerB).startWithResult { 
    // ... 
} 

が見えます。 シナリオでどのように動作させるにはどうすればよいですか。

+0

地図の実行せずにを失敗する原因になります/ flatMapは配列を返します。エラーが返ったらどういう意味ですか? – user1046037

答えて

1

「正確には、エラーは発生しません」という意味です。

Signal/SignalProducer上のイベントのシーケンスがprecisely defined semantic

(0から - X)Value任意の数のTheresのたイベントは、completedfailed又はinterruptedイベントにより、最終的に行きました。その後、もうイベントはありません。

一般的に、あなたは最もオペレーターが唯一valueイベントで動作し、すぐに(それらを操作することなく)failedイベントを伝播すると言うことができます。特定のオペレータが不明な場合は、そのオペレータのドキュメントを参照してください。これは、障害イベントの動作についてはっきりとしています。


そこで問題を理解するための一つの方法は、producerAは(valueイベントの任意の数の後に)正常に完了したときに、その後、producerBを開始し、producerAfailedイベントを送信する場合は、いないと言うことです。

この場合、then演算子は必要なものです。 producerAが完了するとすぐにproducerBが開始されますが、ではなく、が入力されます。producerAが失敗しました。あなたはは、それが(ブロックの取り扱いお使いのエラーがどのように見えるかに依存する)になるので、ここでflatMapErrorを使用し、最終的producerBをトリガーするvalueイベントにfailedイベントを変換したいいけないこと

producerA.then(producerB) 
    .start(Signal.Observer(value: { value in 
    print("Value \(value)") 
    }, failed: {error in 
    print("Error \(error)") 
    })) 

注意、。質問を理解するために


もう一つの方法は、エラーではありませんproducerA各イベントはその場合にはproducerB

後をトリガすべきと言うことです、あなたは返すようにproducerAのイベントにflatMapを使用します各イベントのproducerBproducerAです。ここで注意し、再び、flatMapはすぐfailedイベントを伝播し、そのproducerAfailedイベントは、チェーン全体がproducerB

producerA.flatMap(.concat) { _ in return producerB } 
    .start(Signal.Observer(value: { value in 
    print("Value \(value)") 
    }, failed: {error in 
    print("Error \(error)") 
    })) 
+1

良い答え。私はそれについて考える良い方法は、flatMapErrorが基本的にエラーをキャッチするために使用されていることです。実際、それは[キャッチと呼ばれていました](https://github.com/ReactiveCocoa/ReactiveCocoa/commit/e0c266320ba160944eda894210ece7121216f174)。実際にエラーがシグナルチェーンを終了させたい場合は、使用しないでください。私はチェーン全体がエラーで終了しないようにしたい場合は、 'flatMapError' * after *' then。(producerB) 'を置くことができます。 – jjoelson

+0

@MeXx私は最初のアプローチでいくつかの問題を見ています。最初のプロデューサがプロデューサエラーではなく、2番目のプロデューサがエラーを生成したとしましょう。値を出力していて、失敗したブロックには決して行きません。 – coolly

+0

@coolly、 'producerA'がその値を送信した後、それは完了していますか? 'producerB'は' producerA'が完了した後にのみ開始されます。 'producerA'が値を送る時に' producerB'を起動させたいなら、 'flatMap'で第2のアプローチを使うべきです。 – jjoelson

関連する問題