Барьер сопрограмм Kotlin: дождитесь завершения всех сопрограмм - PullRequest
1 голос
/ 24 октября 2019

Мне нужно запустить много сопрограмм в цикле for и получить обратный вызов в главном потоке после завершения всех задач.

Каков наилучший способ сделать это?

//Main thread
fun foo(){
    messageRepo.getMessages().forEach {message->
       GlobalScope.launch {
            doHardWork(message)
       }
    }
   // here I need some callback to the Main thread that all work is done.
}

И нет варианта перебирать сообщения в CoroutineScope. Итерация должна выполняться в главном потоке.

1 Ответ

2 голосов
/ 24 октября 2019

Вы можете подождать, пока все задачи будут выполнены с помощью awaitAll, а затем выполнить обратный вызов в главном потоке с помощью withContext

fun foo() {
    viewModelScope.launch {
        messageRepo.getMessages().map { message ->
            viewModelScope.async(Dispatchers.IO) {
                doHardWork(message)
            }
        }.awaitAll()
        withContext(Dispatchers.Main) {
            // here I need some callback that all work is done.
        }
    }
}
...