ios - 当且仅当 producerA 不抛出错误时如何执行 producerB?

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

我正在尝试使用以下场景 我有两个制作人 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)事件,最后是 completedfailed中断 事件。之后就没有更多的事件了。

一般来说,您可以说大多数 运算符只对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 的事件上使用 flatMapproducerA< 上的每个事件返回一个 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/

相关文章:

iOS 10 和为属性文本设置自定义字体

iOS 如何在任何 View Controller 中捕获触摸?

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

ios - objective c 父类(super class)中的 protected 变量在 swift 子类中不可访问

objective-c - 如何使用 ReactiveCocoa 简化我的嵌套 for 循环?

c - 截断内存映射文件

ios - Apple 推送通知 - 送达回执

swift - XCode:无缝保留位置更新

java - Reactor对象是线程安全的吗?

rx-java - RxJava - 与 switchMap() 运算符相反?