Вы запускаете onListen(items)
до того, как действительно проверите существование. Любой код, который зависит от данных из базы данных, должен быть внутри обратного вызова, который срабатывает, когда эти данные доступны.
Поскольку вы хотите выполнить несколько проверок, рассмотрите возможность использования счетчика, чтобы проверить, все лииз них завершено:
firestoreInstance.collection("users")
.addSnapshotListener { querySnapshot, firebaseFirestoreException ->
if(firebaseFirestoreException !=null){
return@addSnapshotListener
}
val count = 0
val items = mutableListOf<Item>()
querySnapshot?.documents?.forEach {
firestoreInstance.collection("users")
.document(it.id).collection("engagedChatChannels").get()
.continueWith { result->
if(result.result!!.size() > 0)
items.add(
UserItem(
it.toObject(User::class.java)!!,
it.id,
0,
context
)
)
}
count = count + 1
if (count == querySnapshot?.documents?.size) {
onListen(items)
}
}
}
Обратите внимание, что я не запускал приведенный выше код, поэтому он может содержать синтаксические ошибки. Тем не менее, я надеюсь, что поток ясен, поскольку и вызов onListen
находится внутри обратного вызова, и счетчик, используемый для проверки того, были ли выполнены все проверки вложенных коллекций.
Приведенный выше подход должен работать, но яобычно выбираю другой подход. Если вам нужно знать на пользовательском уровне, есть ли у них определенная подборка, я бы сохранил этот факт в поле каждого пользовательского документа. Таким образом, вы можете просто запросить у пользовательских документов документы, имеющие правильное значение, и предотвратить эту комбинацию вложенного цикла / запроса.