我需要创建依赖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
是需要的。
所有内容在该代码中都能正常运行,但问题出现在我需要在每个步骤(createReport
和createReportStep
)之后执行某些操作时。我将代码放在onNext
块中,但在两个步骤完成后只调用一次。
有两种步骤后接收onNext信号的方法吗?我可以使用这样的东西:
ApiManager.shared
.createReport(report: report)
.concat(ApiManager.shared.createReportStep(reportID: report.ID))
哪个会发出我想要的两个信号,但是又在哪里更新report.ID
以传递给createReportStep
?
答案 0 :(得分:2)
如果您不介意时间组件并且只需要访问report
和createReportStep(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
仅执行一次其工作,但您将按要求进行两次下一次事件。