- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这更像是一个架构问题,而不是一个错误修复问题。
假设这个应用程序允许用户将公共(public)汽车和/或公共(public)汽车站标记为收藏。我的问题是,我应该有一个 ViewModel
使用两个用例还是应该构建一个封装当前逻辑的用例?
同样对于问题部分,我不完全确定应该将组合数据暴露给 UI 层的方式(参见 favouritesExposedLiveData
)
在此先感谢 欢迎任何反馈,这是我的 ViewModel
您可以假设每个用例都从数据源传递正确的数据。
open class FavouritesViewModel @Inject internal constructor(
private val getFavouriteStationsUseCase: GetFavouriteStationsUseCase,
private val getFavouriteBusesUseCase: GetFavouriteBusesUseCase,
private val favouriteMapper: FavouriteMapper,
private val busMapper: BusMapper,
private val stationMapper: StationMapper) : ViewModel() {
private val favouriteBusesLiveData: MutableLiveData<Resource<List<BusView>>> = MutableLiveData()
private val favouriteStationsLiveData: MutableLiveData<Resource<List<StationView>>> = MutableLiveData()
private lateinit var favouritesMediatorLiveData: MediatorLiveData<List<FavouriteView>>
private lateinit var favouritesExposedLiveData: LiveData<Resource<List<FavouriteView>>>
init {
fetchFavourites()
}
override fun onCleared() {
getFavouriteStationsUseCase.dispose()
getFavouriteBusesUseCase.dispose()
super.onCleared()
}
fun getFavourites(): LiveData<Resource<List<FavouriteView>>> {
return favouritesExposedLiveData
}
private fun fetchFavourites() {
favouritesMediatorLiveData.addSource(favouriteStationsLiveData, { favouriteStationListResource ->
if (favouriteStationListResource?.status == ResourceState.SUCCESS) {
favouriteStationListResource.data?.map {
favouriteMapper.mapFromView(it)
}
}
})
favouritesMediatorLiveData.addSource(favouriteBusesLiveData, { favouriteBusesListResource ->
if (favouriteBusesListResource?.status == ResourceState.SUCCESS) {
favouriteBusesListResource.data?.map {
favouriteMapper.mapFromView(it)
}
}
})
getFavouriteStationsUseCase.execute(FavouriteStationsSubscriber())
getFavouriteBusesUseCase.execute(FavouriteBusesSubscriber())
}
inner class FavouriteStationsSubscriber : DisposableSubscriber<List<Station>>() {
override fun onComplete() {}
override fun onNext(t: List<Station>) {
favouriteStationsLiveData.postValue(Resource(ResourceState.SUCCESS, t.map { stationMapper.mapToView(it) }, null))
}
override fun onError(exception: Throwable) {
favouriteStationsLiveData.postValue(Resource(ResourceState.ERROR, null, exception.message))
}
}
inner class FavouriteBusesSubscriber : DisposableSubscriber<List<Bus>>() {
override fun onComplete() {}
override fun onNext(t: List<Bus>) {
favouriteBusesLiveData.postValue(Resource(ResourceState.SUCCESS, t.map { busMapper.mapToView(it) }, null))
}
override fun onError(exception: Throwable) {
favouriteBusesLiveData.postValue(Resource(ResourceState.ERROR, null, exception.message))
}
}
}
MediatorLiveData
(
favouritesMediatorLiveData
)未将数据绑定(bind)回
favouritesExposedLiveData
因为此时,我不确定这是正确的方法;)。
最佳答案
理想情况下,ViewModel 将只有其 View 的 View 状态。通过使用 MediatorLiveData,您可以将所有状态源聚合为一个表示一段时间内的 View 状态。
您可以拥有的是一个数据类,它代表您在 View 模型上构建的 ViewState,并且是您公开的 LiveDatadata class FavouritesViewState(val favoriteStations: List<Station>, val favoritBuses: List<Bus>)
但是,您知道依赖 ViewModel 来构造最终的 ViewState,这有点违反单一责任原则,也使您依赖于 Android 框架。
我将使用具有车站和公共(public)汽车用例的复合 UseCase 来处理它,并返回组合数据,然后您可以轻松地从 ViewModel 公开这些数据。
关于android - 清洁架构 : ViewModel with multiple UseCases on Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47237634/
我对 unix 套接字(TCP 本地)有点困惑 我有一个服务器和一个客户端: client 通过套接字向服务器发送一些信息(使用send)多次 server 打印此数据(server 调用 recv
我一直在尝试从数据集中清理特定列。我多次使用 .apply() 函数以便抛出任何可能出现在列的字符串值中的符号。 对于每个符号,函数如下:.apply(lambda x: x.replace("",
我正在按照 http://nvie.com/posts/a-successful-git-branching-model/ 的建议进行独立项目 我使用以下代码发布了我的代码的版本 1: git che
我一直在尝试从数据集中清理特定列。我多次使用 .apply() 函数以便抛出任何可能出现在列的字符串值中的符号。 对于每个符号,函数如下:.apply(lambda x: x.replace("",
我正在按照 http://nvie.com/posts/a-successful-git-branching-model/ 的建议进行独立项目 我使用以下代码发布了我的代码的版本 1: git che
我想让我的 Controller 变薄,并将业务逻辑与其他操作分开。例如我有一个 Action : public function indexAction() { $languages = $
如何清理 react native 项目? 有什么方法可以像我们可以清理 xcode 项目一样清理 React Native 项目? 任何帮助将不胜感激! 最佳答案 一个 react-native 项
我创建了一组 jRadioButton, 每个按钮都有一个操作监听器,用于在单独的窗口中创建 JTable。 我希望当我按下另一个按钮时,框架将被清理,然后执行另一个JTable, ButtonGro
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this q
我有几项任务要在不共享数据的 AWS EMR 上执行,我想使用同一个 EMR 一个接一个地执行它们。有没有办法将正在运行的 EMR 清理回其初始状态(删除配置单元表,清理所有 HDFS 文件等)避免数
更新 bundle 后,您将拥有一些可能已过时的 gem——因为已安装该 gem 的更新版本。 bundle 可执行文件下没有这样的命令,即 bundle clean。如何摆脱这些过时的 gem ?
当我从命令提示符运行“mvn clean tomcat:run”(未指定任何 tomcat 版本)命令以运行我的 Web 应用程序时,它会下载 tomcat 6.0.29 版本依赖项,如下所示: 组织
我可以在我的 iOS 应用程序中使用干净的 c++ 版本的 openGL 吗?我想写一些基本的包装器,然后将我的 C++ 代码与这个包装器和 App 连接起来。或者我必须只使用 openGLES?使用
我是 Apache/mod_rewrite 的新手。我需要这样做 以下网址: http://www.example.com/applications/seo-friendly-text-for-app
有人能告诉我什么是清理不良 HTML 以便 BeautifulSoup 可以处理它的更好方法 - 应该使用 BeautifulSoup 的按摩方法还是使用正则表达式清理它? 最佳答案 我想我应该改写我
假设我有一个 Controller ,其中包含一个呈现 View 的操作。 View 需要数据来呈现。我知道以下方法来准备并将其发送到 View : 使用实例变量 class CitiesContro
我的 ASP.NET MVC 项目已推送到 Azure 网站,其中包含无效的额外 DLL。这导致项目无法正常运行。如果创建了一个新网站,它会完美运行。在本地清理项目并重新部署并不能解决问题。有没有办法
我尝试了很多变体,但无法实现此目的。一个示例(子 pom.xml): org.apache.maven.plugins maven-clean-plugin
我有一些关于 Vaadin 架构的简单问题。 Vaadin 文档声称它是一个 Single-Page Application (SPA)但是这怎么可能呢,因为页面是在服务器端渲染的,到处都是一些 Ja
我的 Dockerfile 看起来像 FROM python:3.7-slim # System setup ENV USER app ENV APP_DIR /home/app RUN userad
我是一名优秀的程序员,十分优秀!