2017-11-11 12 views
1

서버에서 json 형식의 채팅 목록을받습니다. 나는 그들을 클래스 ChatsModel으로 밀어 넣는다. 그리고이 클래스에 userId 필드가 있는데, 각 채팅에 해당 사용자의 userId이 있습니다. 사용자에 대한 다른 정보는 없습니다. 그리고 UserMessagesResponseflatMap 연산자에서 올바르게 쿼리하는 방법은 무엇입니까?

그래서 유형의 사용자에 대한 정보를 하나 개의 필드가 나는 채팅 목록 및 userId있어 후 userMessagesResponse

널 (null)에 해당된다는 시작 부분에,이, 나는에 대한 정보를 얻기 위해 다른 요청을 보내야합니다 사용자. 나는이 방법을 수행 나는 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)); 

당신이 세부 사항에 아래로 빠져 및되지 않는이 방법이 할 수있는 조정할 반응 모델에 대한 이해.