我正在使用聊天客户端,需要合并来自两个不同Rx来源的数据:
Observable<List<Conversation>> getConversations()
Observable<Message> getMessages()
两个observable都应合并在一个Observable<ConversationsModel>
中,其中ConversationsModel包含会话列表,并包含将消息添加到给定会话的逻辑。
组合的observable应该在每次observable发出时发出更新的ConversationsModel:在订阅时,REST observable发出一次并建立websocket连接。然后,应该通过套接字网关发送的任何新消息都会添加到模型中,然后重新发出。
这是我当前的解决方案,但我对它不满意,因为需要在流外创建ConversationsModel:
ConversationsModel conversations = new ConversationsModel();
conversationsObservable = restGateway.getConversations().map(list -> conversations.setConversations(list))
.mergeWith(socketGateway.getMessages().map(message -> conversations.addMessage(message)))
.doOnSubscribe(disposable -> socketGateway.connect())
.doOnDispose(() -> socketGateway.disconnect())
.replay(1)
.refCount();
我正在寻找的东西是这样的:
conversationsObservable = restGateway.getConversations().map(list -> new ConversationsModel(list))
.withLatestFrom(socketGateway.getMessages(), (conversationsModel, message) -> conversationsModel.addMessage(message))
.doOnSubscribe(disposable -> socketGateway.connect())
.doOnDispose(() -> socketGateway.disconnect())
.replay(1)
.refCount();
问题是withLatestFrom
(以及我迄今为止尝试过的所有其他操作符)在所有可观测量至少发射一次之前不会发出任何内容。在实践中,这意味着我的UI将被阻塞,直到第一条消息通过套接字连接到达,这当然是不可接受的。