2016-11-08 4 views
1

第2のものが最初のものから返された値を必要とする場合、依存するAPIコールを作成する必要があります。 (ID付き)Reportモデルを更新成功し、コールが戻った後、その後私はreport.IDが必要な場合、レポートのステップを作成するために、APIを呼び出す必要がどこ心に来る最初の事はflatMap従属するオブザーバブルを連結する

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

createReport戻りObservable<Report>を使用しています。

このコードではすべてが正常に動作していますが、これらのステップ(createReportcreateReportStep)の後に何かする必要があるときに問題が発生します。 onNextブロックにコードを配置しましたが、両方のステップが完了した後に1回だけ呼び出されます。

両方の手順の後でonNext信号を受信する方法はありますか?私はこのようなもの使用することができます私がしたいように2つの信号をemmitう

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

を、しかし、その後、再びどこがcreateReportStepに渡すからreport.IDを更新されますか?

+0

ご迷惑をおかけして申し訳ございません。 'Report'を作成した後、レポートを作成した後に生成されたレポートIDを必要とする' ReportStep'を作成したいとします。次は、作成したばかりの 'Report'と' ReportStep'オブジェクトの両方にアクセスすることです。あれは正しいですか? – iwillnot

答えて

2

あなたは時間コンポーネントを気にして唯一のreport、何createReportStep(reportID:)によって返され、両方にアクセスする必要がない場合は、あなたがたflatMapのブロック

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

にタプルを作成して行くことができるが観測可能な場合は、両方の結果がタプルに含まれます。時間コンポーネントが重要な場合


すると、あなたはここで、以下の

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

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

Observable.concat([report, reportStep]) 

を行うことができ、重要なビットはshare呼び出しです。 createReportはその作業を1回しか実行できませんが、次の2つのイベントが要求されます。

+0

データベース上にモデルが正常に作成されるまでレポートIDが不明であると仮定して、時間コンポーネントが本当に重要であると推測します。しかし、それは単なる推測です。 :) lazyNeighbourは私よりも彼のユースケースをよく知っています。 – iwillnot