2016-07-18 3 views
2

Retrofit으로 API를 호출하기 위해 Rx를 사용하고 있습니다. 어떤 시점에서 API를 호출하고 응답 1을 기다렸다가 응답을 기다리는 API를 다시 호출합니다. 응답 2를받은 후 Observable을 내보낼 수 있습니다. 내 문제는, 어떻게 해야할지 모르겠다. 2를 호출하고 응답 2를 보낸 후에 만 ​​내 보냅니다.Emit Observable이 두 번째로 수신 된 후에 만 ​​관찰 가능

다음은 Observable 모델을 방출해야하는 클래스의 함수입니다. 외부에서 get2 메소드가 보이지 않아도됩니다.

public Observable<Model> get1(String slug) { 
    return api1 
      .getInfo(slug) 
      .subscribeOn(Schedulers.io()) 
      .map(resonse1 -> { 
       String metadata = response1.getMetadata(); 

       //Make call2 with metadata 
       //call(2) 

       Model model = response1.getModel(); 
       model.setInfo(/*Info from call2*/) 

       return model; 
      }) 
      .observeOn(AndroidSchedulers.mainThread()); 
} 


private Observable<Info> get2(String metadata) { 
    return api2.getInfo(new InfoAsset(metadata)) 
      .subscribeOn(Schedulers.io()) 
      .map(response2 -> { 
       return response2.getInfo; 
      }) 
      .observeOn(AndroidSchedulers.mainThread()); 
} 

답변

2

대신 map 사용 flatMap : 당신이 스레드를 통해 변경 가능한 객체를 사용하고 있기 때문에 당신은 가시성 문제가있을 수 있으므로

.flatMap(response1 -> { 
      String metadata = response1.getMetadata(); 
      return get2(metadata) 
       .map(info -> { 
        Model model = response1.getModel(); 
        model.setInfo(info); 
        return model; 
        }); 
     }) 
... 

그래도주의해야합니다. 변경할 수없는 개체를 사용하거나 변경 사항이 동기화되도록하십시오.

1

를 사용하여 중첩 flatMaps을, 당신은 스레드가 호핑하고 싶어하지 않는 observeOn 사용하지 마십시오

private Observable<Info> get2(String metadata) { 
    return api2.getInfo(new InfoAsset(metadata)) 
     .subscribeOn(Schedulers.io()) 
     .map(response2 -> { 
      return response2.getInfo; 
     }); 
     // no ObserveOn here. 
} 

public Observable<Model> get1(String slug) { 
    return api1 
     .getInfo(slug) 
     .subscribeOn(Schedulers.io()) 
     .flatMap (response1 -> { 
      Model model = response1.getModel(); 
      return get2(response1.getMetadata()) 
        .map(response2 -> { 
         model.setInfo(response2); 
         return model; 
        }); 
     ); 
    }); 
} 
관련 문제