2016-07-03 8 views
0

を作成するために呼び出しますint featured_mediaの値に設定します。どのようにしてNIクラスを取得し、WPMediaをオブジェクトにセットするように、観測可能なチェーンを構築するのですか?複数のAPIは、例えば、私はクラスを持っていた、のは、言ってみましょうオブジェクト

私はこのようなAPI呼び出しを行うためにレトロフィットを使用しています:

@GET("wp-json/wp/v2/posts") 
Observable<ArrayList<NI>>getPostsObservableByCategory(@Query("categories") int category, @Query ("per_page") int limit, @Query("page") int skip); 

@GET("wp-json/wp/v2/media/{id}") 
Observable<WPMedia> getMediaObservable(@Path("id") int id); 

答えて

1

それはあなたが正確に何をしたい、まだ私には全く明らかではないが、私はそれに打撃を与えるでしょう。

私が最初に行うことは、NIには、public void setWPMedia(WPMedia media)のセッターがあるということです。あなたが与える2つのレトロフィット関数の定義を考えると、私は次のあなたが言うだろう:

getPostsObservableByCategory(...) 
    .flatMap(nis -> getMediaObservable(...) 
    .first() 
    .doOnNext(m -> nis.foreach(ni -> ni.setWPMedia(m))) 
    .map(m -> nis)); 

が線でこのラインを介して行く:

  • getPostsObservableByCategory(...)はあなたにNIインスタンスのリストを発するObservableを与えます。これらのリストの各NImediaフィールドは、すでに設定されている場合とされていない場合があります。
  • getMediaObservable(...)に設定する必要があるWPMediaインスタンスをそれぞれ対応するリストの要素に割り当てます。
  • 私はgetMediaObservableの排出数を1に制限します。それ以外の場合はNIのフィールドが複数回設定されますが、これは本当に望ましいとは限りません。この行は、関数/実装のgetMediaObservable(...)によって既に保証されている場合は省略することができます。
  • フィールドを設定することは副作用とみなされますので、インスタンスのリストをループし、getMediaObservableから取得したフィールドにWPMediaフィールドを設定して、ここでdoOnNextが必要です。
  • NIインスタンスのリストを後で残したいと思うので、mapを追加して、mをそのリストに置き換えました。

これがあなたを助けてくれることを願っています!

+0

NIクラスはfeature_media INTが利用できるようにすることができますし、それがgetMediaObservableコールに渡されるようにするために、最初にロードする必要があります。あなたのサンプルが正しく理解されていれば、私はそのintがgetMediaObservable呼び出しにどのように渡されるかは分かりません。私はわかりましたか? –

+0

ああ、その場合はおそらく次のようなものになるはずです: 'getPostsObservableByCategory(...)。flatMap(nis - > Observable.from(nis).flatMap(ni - > getMediaObservable(ni.getFeatureMedia).first() .doOnNext(ni :: setWPMedia).map(m - > ni))) '。それぞれの要素の上に 'Observable'と' flatMap'にリスト 'nis'を置き、' ni'から 'featureMedia'フィールド(getterを介して)を' getMediaObservable'と呼んでいます。 – RvanHeest

+0

私は "推測変数Rに互換性のない境界があります"というエラーが発生しました.map(m - > ni) –

0

私はあなたのデモを見つける!私はあなたが以下のように行うことができると思います。

@GET("/token") 
public Observable<String> getToken(); 

@GET("/user") 
public Observable<User> getUser(@Query("token") String token, @Query("userId") String userId); 

... 

getToken() 
.flatMap(new Func1<String, Observable<User>>() { 
    @Override 
    public Observable<User> onNext(String token) { 
     return getUser(token, userId); 
    }) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(new Observer<User>() { 
    @Override 
    public void onNext(User user) { 
     userView.setUser(user); 
    } 

    @Override 
    public void onCompleted() { 
    } 

    @Override 
    public void onError(Throwable error) { 
     // Error handling 
     ... 
    } 
}); 

Blog Link

関連する問題