链接依赖的可观测量

时间:2016-11-08 11:19:11

标签: ios swift rx-swift reactivex

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

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

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

所有内容在该代码中都能正常运行,但问题出现在我需要在每个步骤(createReportcreateReportStep)之后执行某些操作时。我将代码放在onNext块中,但在两个步骤完成后只调用一次。

有两种步骤后接收onNext信号的方法吗?我可以使用这样的东西:

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

哪个会发出我想要的两个信号,但是又在哪里更新report.ID以传递给createReportStep

1 个答案:

答案 0 :(得分:2)

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

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仅执行一次其工作,但您将按要求进行两次下一次事件。