如何解决作者为什么要用viewModelScope.launch包装taskRepository.refreshTasks?
以下代码来自project。
tasksRepository.refreshTasks()
的功能是将数据从远程服务器插入本地DB,这是一项耗时的操作。
在class TasksViewModel
中,asksRepository.refreshTasks()
用viewModelScope.launch{}
包裹起来,这意味着启动和粗心。
1:如何保证tasksRepository.observeTasks().distinctUntilChanged().switchMap { filterTasks(it) }
返回最新结果?
2:我不知道distinctUntilChanged()
的工作方式,它将继续监听以返回整个生命周期中的最新结果吗?
3:如果我使用tasksRepository.observeTasks().switchMap { filterTasks(it) }
而不是tasksRepository.observeTasks().distinctUntilChanged().switchMap { filterTasks(it) }
代码
class TasksViewModel(..) : ViewModel() {
private val _items: LiveData<List<Task>> = _forceUpdate.switchMap { forceUpdate ->
if (forceUpdate) {
_dataLoading.value = true
viewModelScope.launch {
tasksRepository.refreshTasks()
_dataLoading.value = false
}
}
tasksRepository.observeTasks().distinctUntilChanged().switchMap { filterTasks(it) }
}
...
}
class DefaultTasksRepository(...) : TasksRepository {
override suspend fun refreshTask(taskId: String) {
updateTaskFromRemoteDataSource(taskId)
}
private suspend fun updateTasksFromRemoteDataSource() {
val remoteTasks = tasksRemoteDataSource.getTasks()
if (remoteTasks is Success) {
tasksLocalDataSource.deleteAllTasks()
remoteTasks.data.forEach { task ->
tasksLocalDataSource.saveTask(task)
}
} else if (remoteTasks is Result.Error) {
throw remoteTasks.exception
}
}
override fun observeTasks(): LiveData<Result<List<Task>>> {
return tasksLocalDataSource.observeTasks()
}
}
解决方法
-
switchMap
-返回的LiveData委托通过调用switchMapFunction并将其最新值设置为source创建的最新LiveData,而无需更改引用。 Doc -
是的,它将继续监听以返回整个生命周期中的最新结果。
distinctUntilChanged
创建一个新的LiveData对象,该对象直到更改了源LiveData值后才发出值。如果equals()
产生false
,则认为该值已更改。 -
是的,您也可以使用它,但是即使这些值与最后发出的值相同,它也会继续发出这些值。 例如第一个发出的值是[“ aman”,“ bansal”],第二个是您不想发出的相同的[“ aman”,“ bansal”],因为值相同。因此,您可以使用
distinctUntilChanged
来确保它在更改之前不会发出相同的值。
我希望这会有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。