当且仅当producerA没有抛出错误时,如何执行producerB?

时间:2017-10-05 00:54:43

标签: ios swift reactive-programming reactive-cocoa reactive-swift

我正在尝试使用以下方案 我有两个生产者A和B. producerB只应在producerA成功执行时执行,如果producerA抛出错误,则处理错误并停在那里。所以我试过这样的事情。

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

即使producerB引发错误,看起来producerA也会执行。 请帮助我如何使其与我的方案一起使用。

1 个答案:

答案 0 :(得分:1)

问题是,确切地说,你的意思是"不会引发错误"。

Signal / SignalProducer上的事件序列有precisely defined semantic

Theres是任意数量的Value(来自0 - x)事件,最后是completedfailedinterrupted事件。之后不再有事件了。

通常,您可以说大多数运算符仅对value个事件进行操作,并立即传播failed个事件(不对其进行操作)。如果您不确定某个特定的操作员,请查看该操作员的文档,该文档非常清楚故障事件的行为。

因此,理解这个问题的一种方法是在producerA成功完成时(在任意数量的value事件之后)说,然后启动producerB以及{{1}发送producerA事件,然后不要发送。

在这种情况下,failed运算符正是您所需要的。它会在then完成后立即开始producerB,但如果producerA失败,则

producerA

请注意,您想要在此处使用producerA.then(producerB) .start(Signal.Observer(value: { value in print("Value \(value)") }, failed: {error in print("Error \(error)") })) ,因为这会(取决于您在块中的错误处理方式)将flatMapError个事件转换为{{ 1}}最终会触发failed的事件。

理解这个问题的另一种方法是说 value上的每个事件都不是错误,应该触发producerB一次

在这种情况下,您可以对producerA的事件使用producerBflatMap上的每个事件返回producerA。请注意,producerB会立即传播producerA事件,因此flatMap上的failed事件会导致整个链失败而不会执行 failed

producerA