我正在尝试使用以下场景
我有两个制作人 A 和 B。
producerB
应仅在 producerA
成功执行时执行,并且如果 producerA
抛出错误,则处理错误并停止。所以我尝试了这样的事情。
producerA.flatMapError {
// handle error and stop right here
}.then(producerB).startWithResult {
// ...
}
看起来即使 producerA
抛出错误,producerB
也会执行。
请帮助我如何让它适用于我的场景。
最佳答案
问题是“不抛出错误”究竟是什么意思。
Signal
/SignalProducer
上的事件序列有一个 precisely defined semantic
有任意数量的 Value
(从 0 - x)事件,最后是 completed
、failed
或 中断
事件。之后就没有更多的事件了。
一般来说,您可以说大多数 运算符只对value
事件进行操作,并立即传播失败
事件(而不对它们进行操作)。如果您不确定是否适合特定的运算符,请查看该运算符的文档,其中非常清楚地说明了故障事件的行为。
所以理解这个问题的一种方法是说当 producerA
成功完成时(在任意数量的 value
事件之后),然后启动 producerB
并且如果 producerA
发送了一个 failed
事件,则不要发送。
在这种情况下,then
运算符正是您所需要的。它会在 producerA
完成后立即启动 producerB
,但如果 producerA
失败,则不会!
producerA.then(producerB)
.start(Signal.Observer(value: { value in
print("Value \(value)")
}, failed: {error in
print("Error \(error)")
}))
请注意,您不想在这里使用flatMapError
,因为那会(取决于您在 block 中的错误处理方式)转换失败
事件到 value
最终会触发 producerB
的事件。
理解这个问题的另一种方法是说producerA
上的每个不是错误的事件都应该触发一次producerB
在这种情况下,您可以在 producerA
的事件上使用 flatMap
为 producerA< 上的每个事件返回一个
。再次注意,producerB
/flatMap
会立即传播一个 failed
事件,因此 producerA
上的一个 failed
事件将导致整个没有执行 producerB
producerA.flatMap(.concat) { _ in return producerB }
.start(Signal.Observer(value: { value in
print("Value \(value)")
}, failed: {error in
print("Error \(error)")
}))
关于ios - 当且仅当 producerA 不抛出错误时如何执行 producerB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46576286/