Цикл выполняется быстрее, чем задача запроса Firestore - PullRequest
1 голос
/ 16 января 2020

У нас есть 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, вызывая обмен значениями. Мы пока не можем найти решение для этого. Может кто-нибудь, пожалуйста, совет по этому поводу?

1 Ответ

5 голосов
/ 16 января 2020

Вы можете создать функцию для запроса в пожарном депо и вызывать эту функцию, как только вы получили ответ на элемент для l oop.

private fun firebasecall() {
        var module = modulesDocumentIds.get(index)
//place your firestore call here
        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) {
                    index++
                    if (index < modulesDocumentIds.size) {
                        firebasecall()
                    } else {
                        //loop completes
                    }

                });

            }
    }

Первый раз вызов метода:

if (modulesDocumentIds.size > 0) {
        firebasecall()
    }

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...