【发布时间】:2020-09-08 02:53:04
【问题描述】:
以下代码来自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()
}
}
【问题讨论】: