Как я могу дождаться ответа от Firebase использую kotlin coroutines?
fun getProducts(): ArrayList<User> {
FirebaseDatabase.getInstance().getReference("Users")
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
for (ds in snapshot.children) {
list.add(ds.getValue(User::class.java))
}
}
override fun onCancelled(error: DatabaseError) {
}
})
return list
}
Как я могу дождаться заполнения списка и только потом вернуть его, используя kotlin coroutines? Я знаю что await используется когда нужно вернуть результат из асинхронной операции, но не понимаю как использовать его здесь
Ответы (1 шт):
Автор решения: ЮрийСПб
→ Ссылка
Это примерно так должно выглядеть:
suspend fun getProducts(): List<User> {
return suspendCancellableCoroutine<List<User>> { cancellableContinuation ->
FirebaseDatabase.getInstance().getReference("Users").addListenerForSingleValueEvent(object : ValueEventListener { cont ->
override fun onDataChange(call: Call, e: IOException) {
cancellableContinuation.resumeWith(Result.success(snapshot.children.map { it.getValue(User::class.java) }))
}
override fun onCancelled(error: DatabaseError) {
cancellableContinuation.cancel()
}
})
}
}