У нас есть 2 документа в коллекции «Модули», которые в свою очередь содержат 5 и 6 документов соответственно, в коллекции под названием «Уроки» в разделе «Модули». Когда мы запускаем al oop для анализа документов в коллекции "Modules", чтобы получить документы из коллекции "Lessons" с помощью Firestore, внешний для l oop выполняется быстрее, чем сам запрос firestore, в результате чего значения взаимозаменяются между коллекции. Мы попытались найти несколько решений для этого, используя Tasks.whenAllSuccess () или Tasks.whenAllComplete (), но ничего не получалось, кроме как перевести основной поток в спящий режим на 1 секунду. В этом случае запросы извлекли соответствующие значения. Однако перевод потока в режим сна обязательно приведет к зависанию приложения, что нежелательно. Ниже приведены фрагменты кода:
for (String moduleId : modulesDocumentIds)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
firebaseFirestore.collection("Users")
.document(userDocumentId)
.collection("Courses")
.document(courseDocumentId)
.collection("Modules")
.document(moduleId)
.collection("Lessons")
.orderBy("lesson_number",Query.Direction.ASCENDING)
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult())
{
// Showing Lessons
updateCourseCompletion();
}
});
}
}
}
}
}
});
Здесь, если moduleDocumentIds имеет 2 строковых значения, без перевода Thread в спящий режим, поскольку for для l oop выполняется быстрее, чем задача Firestore Query, уроки извлекаются для второй строки moduleId, а затем извлекаются уроки для первой строки moduleId, вызывая обмен значениями. Мы пока не можем найти решение для этого. Может кто-нибудь, пожалуйста, совет по этому поводу?