4
votes

comment lancer 10 coroutines en boucle for et attendre qu'elles soient toutes terminées?

J'ai besoin de remplir la liste des objets de DB. Et avant de passer de la valeur aux éléments, je veux qu'ils se terminent tous. Y a-t-il ici un appel abrégé en attente () pour chaque élément à attendre. Je veux créer du code propre, peut-être un modèle de conception ou une astuce?

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

        }

    }
    items.value = list


2 commentaires

1) Votre référentiel est-il un singleton? 2) Où lancez-vous cette coroutine? Dans ViewModel?


oui ça singleton et ça à l'intérieur de ViewModel


3 Réponses :


1
votes
IntRange( 0, 10 ).map {
    async {
       // Logic
    }
}.forEach {
    it.await()
}

0 commentaires

17
votes
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

0 commentaires

1
votes

Voici un exemple, similaire aux autres, à utiliser avec les instantanés Firestore.


listOf(AnnualReport(...), AnnualReport(...))

Renvoie:

XXX


0 commentaires