Как запустить 10 сопрограмм для цикла и ждать, пока все они не закончат? - PullRequest
1 голос
/ 27 апреля 2019

Мне нужно заполнить список объектов из БД. И прежде чем передать значение в итемы, я хочу, чтобы все они заканчивались. Есть ли какой-нибудь короткий способ вызова await () для каждого элемента, чтобы ждать. Я хочу сделать чистый код, может быть какой-то шаблон дизайна или трюк?

    for (x in 0..10) {
        launch {
            withContext(Dispatchers.IO){
                list.add(repository.getLastGame(x) ?: MutableLiveData<Task>(Task(cabinId = x)))
            }

        }

    }
    items.value = list

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019
IntRange( 0, 10 ).map {
    async {
       // Logic
    }
}.forEach {
    it.await()
}
1 голос
/ 29 апреля 2019
coroutineScope { // limits the scope of concurrency
    (0..10).map { // is a shorter way to write IntRange(0, 10)
        async(Dispatchers.IO) { // async means "concurrently", context goes here
            list.add(repository.getLastGame(x) ?: MutableLiveData<Task>(Task(cabinId = x)))
        }
    }.awaitAll() // waits all of them
} // if any task crashes -- this scope ends with exception
...