2017-01-12 5 views
0

저는 RxJava를 매우 처음 사용하고 있으며 아직 데이터 흐름을 이해하려고 노력하고 있지만 이것이 토끼 구멍까지 멀리 떨어지기 전에 가능한지 알고 싶습니다.저지 RxJava 클라이언트 및 자원 끝점 컬렉션

목표 : API 리소스를 분리하고이를 허용은 몇 '알려진'API로 제공되는 HREF 링크를 기반으로 데이터를 가져 오기 위해 클라이언트 (웹/모바일)에 유연성을 제공뿐만 아니라, 배포하는 종점.

각 JSON에는 데이터의 전체 세부 정보를 검색 할 수있는 API 리소스에 대한 링크를 제공하는 'href'필드가있는 API에서 JSON 객체 컬렉션이 있습니다. 예를 들어

{ 
    { 
     name: "assassins_creed", 
     href: "games/assassins_creedId123" 
    }, 
    { 
     name: "bioshock", 
     href: "games/bioshockId456" 
    }, 
    { 
     name: "clean_code", 
     href: "books/clean_codeId789" 
    }, 
    { 
     name: "christmas", 
     href: "events/xmas001" 
    } 
} 

컬렉션을 검색 한 후, I ​​그러한 JSON 배열로 HREF 그 값을 이용하여 해당 리소스를 호출하고 컬렉션의 결과를 저장하려는.

String을 JSON 객체의 목록에서 다른 목록으로 매핑하면 Observable에 추가하여 각 리소스를 비동기 적으로 동일한 응답으로 검색 할 수 있습니다.

저는 Jersey example을 참조 용으로 사용하고 있으며 동적 href 링크를 사용하고 응답을 반환 할 수 없다고 우려하고 있습니다. 나는 각 hrefLinks 항목에 대한 Observable 인을 만들 수있는 for 루프에이를 넣어 주저했다

@Override 
public List<JSONObject> getUsersDashboard(TokenModel token, String userId, @Suspended final AsyncResponse async) { 
    List<JSONObject> list = //Database request to get items for userId 
    List<String> hrefLinks = list.stream() 
      .map(e -> (String) e.get("href")) 
      .collect(Collectors.toList()); 

    final Queue<String> errors = new ConcurrentLinkedQueue<>(); 

    Observable.just(new JSONArray()) 
      .zipWith(dashboard(token.getAccessToken(),"plhUrl", errors), (array, objects) -> { 
       array.add(objects); 
       return array; 
      }) 
      .subscribe(response -> { 
       //errors? 
       async.resume(response); 
      }, async::resume); 
} 

private Observable<List<JSONObject>> dashboard(String access, String urlFragment, Queue<String> errors) { 
    Client client = ClientBuilder.newClient(); 
    return RxObservable.from(client).target(urlFragment).request() 
      .header("Authorization", access) 
      .rx() 
      .get(new GenericType<List<JSONObject>>(){}) 
      .onErrorReturn(throwable -> { 
       errors.offer(throwable.getMessage()); 
       return Collections.emptyList(); 
      }); 
} 

:에

은 지금까지 나는 멈췄다.

여러 리소스의 응답을 클라이언트에 대한 단일 일관된 응답으로 가져 오려면 어떻게해야합니까?

답변

0

flatMap 연산자는 당신이 찾고있는 것입니다. 플랫 링크 연산자에서 각 링크를 원래의 스트림으로 그 결과를 전달하는 새로운 관찰 가능으로 변환 할 수 있도록 스트림에서 href 링크를 내보낼 수 있습니다. 제 생각에 이것은 정확히 당신이 묘사 한 행동이라고 생각합니다.

편집 : Retrofit 라이브러리는 링크에서 관찰 가능 정보를 생성하는 멋진 인터페이스를 제공합니다. 당신의 예제에 대해 더 자세히 설명하기 위해서 먼저 컬렉션 ​​객체를 map 연산자를 사용하는 일종의 반복 가능 (Iterable)으로 변환해야합니다. 인터럽터를 가지고 나면, Observable.from()을 사용하여 Iterable에 속한 아이템의 관찰 가능 항목을 생성하려면 flatMap을 사용하십시오. 이렇게하면 링크가 별도의 배출물로 방출됩니다. 그런 다음 flatMap을 다시 사용하여 각 링크를 네트워크 요청의 관찰 가능 항목으로 변환하여 방출을 원래 스트림으로 다시 전달합니다.

getCollectionObjectObservable() 
    .map(result -> iterable) // transform the object into Iterable(ie. List) 
    .flatMap(iterable -> Observable.from(iterable)) 
    .flatMap(link -> createRequestObservable(link)) 
    .subscribe(result -> /* process the result of each item here */) 
+0

getCollectionObjectObservable() :이 Retrofit 라이브러리의 메소드입니까? – fakataha

+0

좀 더 많은 작업과 도움을받은 후, 나는 그것을 작동 시켰습니다. 고마워요! – fakataha