我有几个域对象,消息和联系人:
public class Contact {
String name;
}
public class Message {
String body;
Contact contact;
}
我填充Message
列表并向用户显示。以异步方式检索每个消息的联系信息,然后更新列表。这基本上就是我设置它的方式:
listAdapter.setDataSet(listOfMessages);
for (Message message : listOfMessages) {
fetchContactDetails(message);
}
...
fetchContactDetails(Message message) {
contactService
.fetchContactDetails(listOfMessages)
.subscribeOn... // observe, etc
.observe(new Observable<Contact>() {
onNext(Contact contact) {
message.setContact(contact);
list.notifyChanged(message);
}
});
这感觉就像很多代码,因为我可以只更新服务函数Message
中的每个Contact
contactService.fetchContactDetails
。相反,使用服务方法修改传入的对象而不返回任何内容感觉不清楚。
使用服务函数更新作为参数传入的Object而不返回任何内容是不是很糟糕?
答案 0 :(得分:0)
使用服务函数更新作为参数传入的Object而不返回任何内容是不是很糟糕?
不,您可以使用void
实现Observable
方法Completable
,但在您的情况下,您仍需要更新主线程上的UI,因此您将订阅并处理mainThread上的onNext
(通过添加observeOn(AndroidSchedulers.mainThread())
)
因此,在这种情况下,您的方法似乎不是纯粹的void
方法,它不返回任何内容,而是更新某些数据并将其返回到UI进行处理的方法。
所以,我认为这是一个更普遍的架构问题,关于如何正确分离代码。我会在单独的Observable
中一起收集模型/域逻辑,让UI /表示只处理UI更新。
BTW,您可以使用from()
和flatMap()
Observable.from(listOfMessages)
.flatMap(msg -> contactService.fetchContactDetails(msg))
然后你可以控制enitre进程,比如在完成所有更新时做某事,或者限制并行性或其他什么。