2017-11-11 117 views
1

我从服务器获取json格式的聊天列表。我把他们推到ChatsModel。此类中有userId字段,即在每个聊天中有该用户的userId。没有关于用户的其他信息。还有就是有关类型的用户信息的一个领域UserMessagesResponse如何在flatMap运算符中正确查询?

所以,在那个userMessagesResponse等于null

我聊天列表和userId之后开始时,我要送另一个请求获取有关信息用户。我这样做,是这样的:发生在flatMap操作的块

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; 
} 

所有这些行动,是因为我需要推动有关用户接收到的信息到ChatsModel类的userMessagesResponse领域。如果成功,我发送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)); 

你不要在细节上陷入下来,这样可以调整你的理解反应模型。