поэтому обычно, когда вам нужно делать разные вызовы API и ждать, вы делаете что-то вроде этого:
viewModelScope.launch {
withContext(dispatcherProvider.heavyTasks) {
val apiResponse1 = api.get1() //suspend function
val apiResponse2 = api.get2() //suspend function
if (apiResponse1.isSuccessful() && apiResponse2.isSuccessful() { .. }
}
}
но что произойдет, если мне придется выполнять несколько одновременных одинаковых вызовов API с разными параметрами:
viewModelScope.launch {
withContext(dispatcherProvider.heavyTasks) {
val multipleIds = listOf(1, 2, 3, 4, 5, ..)
val content = arrayListOf<CustomObj>()
multipleIds.forEach { id ->
val apiResponse1 = api.get1(id) //suspend function
if (apiResponse1.isSuccessful()) {
content.find { it.id == id }.enable = true
}
}
liveData.postValue(content)
}
}
Проблема со вторым подходом заключается в том, что он просматривает все идентификаторы списка multipleIds
и выполняет асинхронные вызовы, но content
, вероятно, будет опубликован до этого. Как я могу дождаться завершения всех ответов для каждого цикла и только затем postValue
контента для просмотра?
async
и ожидание темы помогут - person dariush f   schedule 14.07.2020