чтение в FireStore асинхронно, и я хочу синхронного поведения - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу локально хранить данные, которые я читаю из облака.Чтобы достичь этого, я использую глобальную переменную (quizzes) для хранения всех данных.

Для этого, когда я строю свои Quiz объекты, мне нужно убедиться, что перед их созданиемсоответствующие данные уже загружены из облака.Поскольку при чтении данных из firestore это происходит асинхронно.

Я не применял это (ожидание завершения чтения) до того, как-просто использовал прослушиватели onSuccess, и столкнулся с проблемой синхронизации, потому что задачи чтения не былиЯ закончил работу до того, как создал свои Quiz объекты с данными из облака.

Я исправил это с помощью очень примитивного способа «ожидания ожидания» до завершения чтения из облака.Я знаю, что это очень глупо, очень плохая практика и делает приложение слишком медленным, и я уверен, что есть лучший способ это исправить.

 private void downloadQuizzesFromCloud(){


    String user_id = FirebaseAuth.getInstance().getCurrentUser().getUid();
    final FirebaseFirestore db = FirebaseFirestore.getInstance();
    CollectionReference quizzesRefrence = db.collection("users").document(user_id).collection("quizzes");

    Task<QuerySnapshot> task = quizzesRefrence.get();
    while(task.isComplete() == false){
        System.out.println("busy wait");
    }


    for (QueryDocumentSnapshot document : task.getResult()) {
        Quiz quizDownloaded = getQuizFromCloud(document.getId());
        quizzes.add(quizDownloaded);
    }

}

Я посмотрел онлайн в документации поFireStore и Firebase и не нашел ничего, что я мог бы использовать.(например, пытался использовать метод wait), но это не помогло.

Что еще я могу сделать, чтобы решить эту проблему синхронизации?

1 Ответ

0 голосов
/ 29 декабря 2018

Я не понял, пробовали ли вы это решение, но я думаю, что это лучше и проще: добавьте onCompleteListener к объекту Task, возвращенному из метода get(), если задание выполнено успешно, вы можете делать все свои вещи, как это:

private void downloadQuizzesFromCloud(){


String user_id = FirebaseAuth.getInstance().getCurrentUser().getUid();
final FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference quizzesRefrence = db.collection("users").document(user_id).collection("quizzes");

quizzesRefrence.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccesful()) {
               for (QueryDocumentSnapshot document : task.getResult()) {
                    Quiz quizDownloaded = getQuizFromCloud(document.getId());
                    quizzes.add(quizDownloaded);
               }
             }
         });
}
}

Таким образом, вы сделаете все, что вам нужно сделать (здесь цикл for), как только данные будут загружены

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