【问题标题】:Chaining dependent observables链接依赖的 observables
【发布时间】:2016-11-08 11:19:10
【问题描述】:

我需要创建依赖 API 调用,其中第二个调用需要第一个返回的值。首先想到的是使用 flatMap

ApiManager.shared
    .createReport(report: report)
    .flatMap { (report) -> Observable<Report> in
        return ApiManager.shared.createReportStep(reportID: report.ID)
    }

createReport 返回Observable&lt;Report&gt;,其中调用成功后返回更新的Report 模型(带ID),之后我需要调用API 来创建报告步骤,其中需要report.ID

该代码看起来一切正常,但当我需要在每个步骤之后执行某些操作时(createReportcreateReportStep)就会出现问题。我将代码放在onNext 块中,但是在两个步骤都完成后它只被调用一次。

有没有办法在两个步骤之后接收 onNext 信号?我可以使用这样的东西:

ApiManager.shared
      .createReport(report: report)
      .concat(ApiManager.shared.createReportStep(reportID: report.ID))

这会像我想要的那样发出两个信号,但是我又从哪里获得更新 report.ID 以传递到 createReportStep

【问题讨论】:

  • 请帮助我更好地理解您的问题。创建Report 后,您希望创建ReportStep,这需要创建报告后生成的报告ID。接下来要做的是访问刚刚创建的ReportReportStep 对象。对吗?

标签: ios swift rx-swift reactivex


【解决方案1】:

如果您不介意时间组件并且只需要访问reportcreateReportStep(reportID:) 返回的内容,您可以在flatMap 的块中创建一个元组

ApiManager.shared
    .createReport(report: report)
    .flatMap { (report) -> Observable<Report> in
        return ApiManager.shared.createReportStep(reportID: report.ID)
            .map { (report, $0) }
    }

生成的 observable 将在一个元组中包含两个结果。


如果时间分量很重要,您可以执行以下操作

let report = ApiManager.shared
  .createReport(report: report)
  .share()

let reportStep = report.map { $0.ID }.flatMap(ApiManager.shared.createReportStep)

Observable.concat([report, reportStep])

这里,重要的是share 调用。它将确保createReport 只执行一次它的工作,但您将按照要求有两个下一个事件。

【讨论】:

  • 我猜时间组件确实很重要,假设在数据库上成功创建模型之前报告 ID 是未知的。但这只是一个猜测。 :)lazyNeighbour 会比我更了解他的用例。
猜你喜欢
  • 1970-01-01
  • 2021-09-13
  • 2021-01-16
  • 2019-02-03
  • 2019-04-22
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多