2017-11-11 493 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)); 

你不要在細節上陷入下來,這樣可以調整你的理解反應模型。