Eu tenho uma função assim
fun getUsersList(userIds: List<String>): List<User> {
val list = mutableListOf<User>()
userIds.forEach { id ->
getUserFromDatabase(id) { user ->
list.add(user)
}
}
return list
}
Claro que neste caso o método retorna uma lista vazia porque ele chama return list
antes que as tarefas assíncronas no ciclo sejam concluídas.
Então como fazê-lo esperar até que o ciclo seja concluído antes de retornar?
Aprendi o básico da coroutine, mas ainda não tenho ideia de como lidar com isso, é por isso que estou usando retornos de chamada para atualizar o viewModel.
UPD: Para esclarecer minha situação, eu pego (por exemplo) List<Type1>
do banco de dados e dessa lista pego userId
's e depois pego User
's do banco de dados. Eu preciso construir Map<Type1,User> e colocá-lo em viewModel. Para isso eu uso:
list<Type1>.forEach { type1 ->
getUserFromDatabase(type1.userId) { user ->
map.put(type1, user)
}
}
Na verdade, a pergunta era sobre retornar resultados em vez de callbacks e obtive a resposta. Além disso, eu mesmo cuidarei disso. Obrigado a todos.
Crie um
List<Deferred<User>>
e então chameawaitAll()
-o para obter oList<User>
. Tudo isso deve estar acontecendo em aCoroutineScope
- no meu exemplo, ele é criado comcoroutineScope
, mas você pode usarwithContext
or de alguma outra forma.