gpt4 book ai didi

java - 如何在 flatMap 运算符中正确查询?

转载 作者:行者123 更新时间:2023-11-30 00:16:13 25 4
gpt4 key购买 nike

我从服务器获取了 json 格式的聊天列表。我将它们推送到 ChatsModel 类中。并且在这个类中有字段userId,也就是说在每次聊天中都有该用户的userId。没有关于用户的其他信息。并且有一个字段用于有关类型 UserMessagesResponse

的用户的信息

所以,一开始 userMessagesResponse 等于 null

在获得聊天列表和userId 后,我必须发送另一个请求以获取有关用户的信息。我这样做:

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 运算符的 block 中,因为我需要将收到的有关用户的信息推送到 ChatsModel< 的 userMessagesResponse 字段中类。如果成功,我将 chatsModel 发送到适配器

两个请求都正常工作。我正在获取 userId 列表和有关用户的信息。

问题在于,在 flatMap 中返回 chatsModel 之后,return chatsModel 没有进一步发生,subscriber 没有任何反应。

问题:如何解决这个问题以及通常如何正确解决此类问题?

最佳答案

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

这样您就不会陷入细节的泥潭,并且可以调整您对响应式模型的理解。

关于java - 如何在 flatMap 运算符中正确查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47234178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com