我正在尝试处理以下方案我有两个生产者A和B。 producerB
仅在成功执行producerA
时才执行,并且如果producerA
引发错误,处理错误并停止此处。所以我尝试了这样的事情。
producerA.flatMapError {
// handle error and stop right here
}.then(producerB).startWithResult {
// ...
}
即使producerA
丢弃错误,也看起来像producerB
执行。请帮助我如何使其与我的方案一起使用。
问题是,您的意思是"不丢失错误"。
Signal
/SignalProducer
上事件的顺序具有精确定义的语义
有任意数量的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)")
}))
请注意,您 dont 想要在此处使用flatMapError
,因为这将(取决于块中的错误处理方式)将failed
事件转换为value
最终触发producerB
的事件。bk_hr>
理解问题的另一种方法是说 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)")
}))
尝试以下:
func scenario() -> SignalProducer<MyValueType, MyErrorType> {
return SignalProducer { observer, _ in
producerA.startWithResult({ (res) in
switch res {
case .success(let value):
observer.send(value: value)
observer.sendCompleted()
case .failure(let error):
print(error)//handle your error here
observer.send(error: err)
}
})
}.then(producerB)
}
scenario().start()
您创建一个自定义信号生产者并通过告诉观察者根据您的方案操作来定义所需的行为。