База данных базы данных Firebase запрашивает пользователей в цикле

Например, у меня есть список проблем. У каждой проблемы есть владелец uid. С помощью этого uid я должен найти нужных пользователей и отобразить его имя и фотографию. Я делаю это с помощью компонента архитектуры ViewModel:

issues.forEach { IssueRepository().getIssueOwner(it.owner).observe(this, Observer { }) } 

Метод getIssueOwner:

 fun getIssueOwner(uid: String): MutableLiveData<UserEntity> { val user: MutableLiveData<UserEntity> = MutableLiveData() val usersReference = FirebaseDatabase.getInstance().reference.child("users") val query = usersReference.orderByKey().equalTo(uid).limitToFirst(1) query.addValueEventListener(object : ValueEventListener { override fun onCancelled(p0: DatabaseError?) { } override fun onDataChange(dataSnapshot: DataSnapshot?) { if (dataSnapshot == null) { return } dataSnapshot.children.forEach { val name = it.child("displayName").value user.postValue(UserEntity(name)) } } }) return user } 

Но я уверен, что этот подход неверен. Не могли бы вы дать мне совет, как я должен построить архитектуру моего приложения?

Эта:

 val query = usersReference.orderByKey().equalTo(uid).limitToFirst(1) 

Получает точно такие же результаты, как это намного проще:

 val userReference = usersReference.child(uid) 

Единственное различие между ними состоит в том, что первый фрагмент дает вам снимок со списком одного элемента, а второй фрагмент дает вам снимок с помощью всего элемента.

 val userReference = usersReference.child(uid) userReference.addValueEventListener(object : ValueEventListener { override fun onCancelled(error: DatabaseError?) { throw error.toException() // don't ignore errors } override fun onDataChange(dataSnapshot: DataSnapshot?) { if (dataSnapshot.exists() val name = dataSnapshot.child("displayName").value user.postValue(UserEntity(name)) } } }) 

Обратите внимание, что вы по-прежнему не можете вернуть пользователя из метода getIssueOwner . Это связано с тем, что данные загружаются из Firebase асинхронно, и к тому моменту, когда выполняется ваш оператор return , onDataChange еще не был вызван.

Я рекомендую вам прочитать некоторые из этих предыдущих вопросов по этой теме, чтобы узнать больше об асинхронном характере Firebase (и большей части современной сети):

  • android – Возвращаемое значение Firebase из datasnapshot Почему?
  • Запрос данных от firebase
  • Wait Firebase async извлекает данные в android
  • Установка значения свойства Singleton в Firebase Listener
Intereting Posts
Как найти все классы в пакете, используя отражение в kotlin Методы ведения журнала Anko не могут быть решены Почему у нас есть функции, которые назвали componentN в Котлине Класс Android не найден Intermitten и распространяется через код Передача любого в массив в Котлин Почему этот тест инструментария Android вызывает активность onCreate дважды? У Kotlin Android Extensions кешируются синтетические свойства или каждый раз, когда он вызывает findViewById ()? Референциальное и структурное равенство в Котлине Kotlin: как наследовать от подписчика RxJava Android Studio 3.0 gradle 3.0.0-beta2, ломает Kotlin Unit Test Coverage? Отправка предварительно рассчитанного результата от одной активности Kotlin в текстовое представление в другом Ошибка сборки: ошибка: выполнение не выполнено для задачи: app: compileLightningLiteDebugKotlin '. > Ошибка компиляции Как запустить тесты kotlintest с помощью gradle? Проблема с расширением метода в скрипте Котлин Возможно ли издеваться над аксессуарами от Mockito в Котлине?