【问题标题】:Array of observables where the output of each is the input of the next可观察的数组,其中每个的输出是下一个的输入
【发布时间】:2017-11-01 15:23:51
【问题描述】:

我正在尝试使用 RxSwift 对多个数据源执行操作。但是,我不知道如何完成以下操作。

我有一个 observabless 数组,其中每个的输出应该是下一个的输入。所以,我想做一些类似的事情,获取第一个 observable,等待结果并将其传递给下一个,一直到数组的末尾并返回一个最终值。

这可能吗?提前致谢。

*** 更新:好的,我会根据要求更具体。

我在数组中使用的“observables”是自定义的。我使用返回Observable.create { ... } 的函数。在闭包内部,我运行一个异步操作来转换值,然后在完成之前将结果发送给观察者。该结果值必须传递给下一个可观察对象,以此类推到数组中的最后一个可观察对象以获得最终值。

observable 可以发送多个值,但它们必须像装配线一样从一个 observable 传递到下一个。

【问题讨论】:

  • 你能说得更具体点吗? “等待结果并将其传递给下一个”是什么意思?根据定义,可观察对象产生 0..n 个“结果”,那么是每个结果还是一个特定结果?也就是说,什么是“最终价值”?
  • 如果您有代码可以在您的问题中发布,那就太好了。现在你的描述没有意义——如果你有一个可观察的数组,你不能将一个的输出传递给下一个的“输入”——可观察的没有“输入”。观察者有,但他们没有输出。受试者两者都有,但这不是你所描述的。
  • “结果值,必须传递给下一个 observable” - 好的,这称为“连续传递样式 (CPS)”,通常描述函数式编程中的控制流,特别是 Rx 中的控制流。将一个 observable 发出的 values 转换为其他 observables 是通过 .flatMap() 运算符实现的。不过还有很多其他运算符,最好提前学习它们以了解您的选择 - 请参阅rxmarbles.com的概述@

标签: swift reactive-programming rx-swift


【解决方案1】:

很难确切知道您要什么,因为Observables 没有确切的输入,但我认为这是一个常见问题。

您可能正在寻找concatreduce 运算符的组合,它们允许您从Observable 发出的值中累积数据。见ReactiveX's documentation for Mathematical and Aggregate Operators

希望这可以帮助您入门:

// "I have an array of observables..."
let one = Observable.deferred { Observable.just(1) }
let two = Observable.deferred { Observable.just(2) }
let observables = [one, two]

// "the output of each, should be the input of the next"
// this is problematic, because observables do not strictly have inputs.
let resultsFromEach = Observable.concat(observables)

resultsFromEach
    .reduce(0) { result, next in
        result + 1
    }
    .debug("result")
    .subscribe()

【讨论】:

  • 嗨,我刚刚编辑了这个问题,我想我没有正确解释自己。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
相关资源
最近更新 更多