2016-11-08 6 views
1

두 번째 API가 첫 번째 매개 변수에 의해 반환 된 값을 필요로하는 종속 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 블록에 코드를 삽입했지만 두 단계가 모두 완료된 후에는 한 번만 호출됩니다.

두 단계 후에 onNext 신호를 수신하는 방법이 있습니까? createReportStep에 전달할 다시 내가로부터 report.ID 업데이트합니까 어디 내가 원하는처럼 두 개의 신호를 emmit 것

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

:하지만, 나는 이런 식으로 뭔가를 사용할 수 있을까?

+0

문제를 더 잘 이해할 수 있도록 도와주세요. 'Report'를 생성 한 후, 보고서를 생성 한 후에 생성 된 ReportID를 필요로하는'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) } 
    } 

결과를 튜플을 만드는 갈 수있다 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이 한 번만 작업을 수행 할 수 있도록 보장하지만 요청한대로 다음 두 개의 이벤트가 발생합니다.

+0

데이터베이스에서 모델을 성공적으로 만들 때까지 보고서 ID를 알 수 없다고 가정하면 시간 구성 요소가 실제로 중요하다고 생각합니다. 그러나 그것은 단지 추측 일뿐입니다. :) lazyNeighbour는 나보다 자신의 유스 케이스를 더 잘 알 것이다. – iwillnot