2017-05-20 3 views
2

먼저 요청, 내 상황을 설명하자 : 내가 API를 통해 새 레코드를 등록 할

  • .
  • API를 통해 일부 행을 업데이트하려고합니다.
  • 이러한 모든 요청이 종료되면 알림을 받아야 다른 작업을 시작할 수 있습니다.

은 특히 나는이 두 ArrayList : 각 보고서 내 ApiService에서 Observable 인스턴스를 얻는 방법을 사용할 수 있습니다

ArrayList<Report> createdReports = myHelper.getOfflineCreatedReports(); 
ArrayList<Report> editedReports = myHelper.getOfflineEditedReports(); 

(내 개조 구현과 관련된).

 Observable<NewReportResponse> createdReportsObs = Observable.from(createdReports) // .just() != .from() 
      .flatMap(new Func1<Report, Observable<NewReportResponse>>() { 
       @Override 
       public Observable<NewReportResponse> call(Report report) { 
        return report.postToServer(); 
       } 
      }); 

    Observable<NewReportResponse> editedReportsObs = Observable.from(editedReports) 
      .flatMap(new Func1<Report, Observable<NewReportResponse>>() { 
       @Override 
       public Observable<NewReportResponse> call(Report report) { 
        return report.updateInServer(); 
       } 
      }); 

나는 각 보고서에 대한 관찰 가능한 하나를 얻기 위해 flatMap 연산자를 사용하고 있습니다.

하지만 모든 요청이 완료 될 때까지 기다리는 방법을 모르겠습니다.

나는 zip 연산자를 사용하려고 생각하고있었습니다.

Observable.zip(createdReportsObs, editedReportsObs, new Func2<NewReportResponse, NewReportResponse, Boolean>() { 
     @Override 
     public Boolean call(NewReportResponse justOneResponse, NewReportResponse justOneResponse2) { 
      return false; 
     } 
    }); 

불행하게도 나는 Observables은 쌍을 만드는 데 사용됩니다 zip 몇 가지 예를 보았다.

달성 할 수있는 연산자는 무엇입니까? 또는 rxJava를 다른 접근 방식으로 사용하는 방법.

미리 감사드립니다.

답변

1

이것은 내 방식입니다. 모범 사례는 아닙니다.

Observable.merge(createdReportsObs, editedReportsObs) 
      .toList() 
      .flatMap(Observable::from) 
      .xxx //Now they are completed, do what you want 
      .subscribe(); 
+0

감사합니다. '''merge'' 바로 뒤에'''subscribe''를 사용하면 어떻게됩니까? – JCarlos

+0

'doOnCompleted'와'doOnError'보다 더 많은 일을 할 수 있습니다. 이 작업이 끝나면 doOnNext도 완료된 후에 호출됩니다. –

1

RxJava 2를 사용하고 있습니까? 그렇다면 새로운 completable api를 사용할 수 있습니다. 이것은 서버 결과를 알 필요가 없으며 서버 결과가 완료 될 때까지 기다릴 필요가 있다고 가정합니다.

Completeable.merge(createdReportsObs.toCompleteable(), 
        editedReportsObs.toCompleteable()) 
      .subscribe()