问题是,“不引发错误”的确切含义是什么。
Signal/SignalProducer 上的事件序列有一个 precisely defined semantic
有任意数量的 Value(从 0 - x)事件,最后是 completed、failed 或 interrupted 事件。之后就没有更多的事件了。
通常您可以说大多数运算符仅对value 事件进行操作,并立即传播failed 事件(不对其进行操作)。如果您不确定特定的运算符,请查看该运算符的文档,该文档非常清楚失败事件的行为。
所以理解问题的一种方法是说当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,因为这会(取决于您在块中的错误处理方式)将 failed 事件转换为 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)")
}))