问题是,确切地说,“不抛出错误”是什么意思。
Signal
/上的事件序列SignalProducer
具有精确定义的语义
有任意数量的Value
(从 0 - x)事件,最后是 a或completed
Event 。之后就没有更多的事件了。failed
interrupted
一般来说,您可以说大多数运算符仅对value
事件进行操作并立即传播failed
事件(不对其进行操作)。如果您不确定特定操作员,请查看该操作员的文档,该文档非常清楚失败事件的行为。
所以理解这个问题的一种方法是说什么时候producerA
成功完成(在任意数量的value
事件之后),然后开始producerB
,如果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
因为这会(取决于您在块中的错误处理方式)将failed
事件转换为最终value
会触发的事件producerB
。
理解这个问题的另一种方法是说不是错误的每个事件都应该触发一次producerA
producerB
在这种情况下,您将使用flatMap
on 事件为上的每个事件producerA
返回一个。再次注意,这里会立即传播一个事件,所以一个事件 on会导致整个链失败而不执行producerB
producerA
flatMap
failed
failed
producerA
producerB
producerA.flatMap(.concat) { _ in return producerB }
.start(Signal.Observer(value: { value in
print("Value \(value)")
}, failed: {error in
print("Error \(error)")
}))