2017-11-11 9 views
1

サーバーからjson形式のチャットのリストを取得します。私はそれらをクラスChatsModelにプッシュします。このクラスにはuserIdというフィールドがあります。そのチャットにはそのユーザーのuserIdがあります。ユーザーに関するその他の情報はありません。そして、タイプだから、UserMessagesResponseflatMap演算子で正しく照会する方法は?

の利用者については、一つのフィールドはuserMessagesResponse私はチャットリストとuserIdを得た後、私はに関する情報を取得するための別の要求を送信する必要がヌル

に等しいことを初めに、そこにありますユーザー。私はそれをこのように実行します。私はChatsModelクラスのuserMessagesResponseフィールドにユーザーに関する受信した情報をプッシュする必要があるため

private void loadChatsFromNetwork(int count, AccessDataModel accessDataModel) { 
String accessToken = accessDataModel.getAccessToken(); 

Flowable<ChatsModel> chatsModelSingle = getChatsApi().getChats(count, accessToken, Constants.api_version) 
     .subscribeOn(Schedulers.io()) 
     .flatMap(chatsModel -> { 
      RealmList<Item> items = chatsModel.getResponse().getItems(); 
      StringBuilder userIds = new StringBuilder(); 

      for (Item item : items) { 
       userIds.append(item.getMessage().getUserId()).append(","); 
      } 

      return loadUsersById(userIds, chatsModel); 
     }) 
     .observeOn(AndroidSchedulers.mainThread()); 

chatsModelSingle.subscribe(chatsModel -> { 
      Log.d(TAG, chatsModel.getResponse().getItems().first().getMessage().getMessagesUserItem().getFirstName()); 
      chatsRepository.updateChatsData(chatsModel); 
      iGetChatsCallback.onGetChatsSuccess(chatsModel); 
     }, 
     throwable -> { 
      iGetChatsCallback.onGetChatsError(throwable.getMessage()); 
      Log.d(TAG, "onError() " + throwable.getMessage()); 
     }); 
} 

private ChatsModel loadUsersById(StringBuilder userIds, ChatsModel chatsModel) { 

MyApplication.getChatsApi().getUsersByChats(userIds.toString(), "photo_100") 
     .subscribe(messagesUser -> { 

      RealmList<Item> item = chatsModel.getResponse().getItems(); 

      for (int i = 0; i < item.size(); i++) { 
       Message message = item.get(i).getMessage(); 

       RealmList<UserMessagesResponse> messagesUserItemList = messagesUser.getUserMessagesResponse(); 
       for (UserMessagesResponse messagesResponse : messagesUserItemList) { 
        if (messagesResponse.getUid().equals(message.getUserId())) { 
         message.setMessagesUserItem(messagesResponse); 
         chatsModel.getResponse().getItems().get(i).setMessage(message); 
        } 
       } 
      } 

     }); 

return chatsModel; 
} 

すべてのこれらのアクションは、flatMapオペレータのブロックで発生します。成功した場合は、chatsModelをアダプタに送信します。

どちらのリクエストも正しく動作しています。私はuserIdリストとそのユーザーに関する情報を得ています。

問題は、chatsModelがflatMapで返された後、return chatsModelが何も起こらないということです。subscriberは何も反応しません。

質問:これを修正する方法と一般的にどのように問題を適切に解決するには?

答えて

1

flatMap()演算子には、Observable()を返す関数が渡されます。あなたのコードでは、返信はChatsModelです。 Observable.just(loadUsersById(userIds, chatsModel))を返すだけで十分であるかもしれません。flatMap()が期待しているとおりです。

は、より一般的な状況では、この種の問題を解決し、問題の非常に単純なモデルで起動するには:

Observable<Integer> chatHistory; 
... 
Observable<Long> getInfoAboutI(Integer i) { 
    return Observable.just(1L); 
} 
... 
chatHistory 
    .flatMap(i -> getInfoAboutI(i)) 
    .subscribe(j -> logger.debug("j: " + j)); 

あなたが詳細にダウン陥っ及びません。この方法では調整でき、あなたの反応モデルの理解

関連する問題