Проблемы обратного вызова с Firebase и Android - PullRequest
0 голосов
/ 19 июня 2020

У меня проблема при получении данных из Firebase Firestore. Я хочу получить несколько документов из моей коллекции «Сообщения», и это нормально работает. Но чтобы получить мои пользовательские документы из моей коллекции «Пользователи», мне нужно запустить несколько задач (Задача), которые ВСЕ должны быть выполнены, прежде чем я захочу вызвать свою функцию обратного вызова, и я не могу понять, как это сделать. Есть ли способ сделать это с помощью обратного вызова? Я пытался решить эту проблему с помощью продолжения, но у меня возникли трудности.

Заранее спасибо. Вот простой код, который я написал, чтобы вы могли немного лучше понять проблему.

    public void getPosts(final postCallback callback) {
        final FirebaseFirestore db = FirebaseFirestore.getInstance();
        CollectionReference postsRef = db.collection("Posts");
        Query postsQuery = postsRef.orderBy("createTime", Query.Direction.DESCENDING).limit(20);
        // Starting the post documents
        Task<QuerySnapshot> task = postsQuery.get();
        task.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if(task.isSuccessful()){
                    QuerySnapshot querySnapshot = task.getResult();
                    List<DocumentSnapshot> docsList = querySnapshot.getDocuments();
                    for(DocumentSnapshot docSnap : docsList){
                        String userID = docSnap.getString("originalPoster");
                        // getting user documents
                        Task<DocumentSnapshot> userTask = db.collection("Users").document(userID).get();
                        userTask.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                            @Override
                            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                                DocumentSnapshot userDoc = task.getResult();
                                String userID = userDoc.getId();
                                String firstName = userDoc.getString("first_name");
                                String surname = userDoc.getString("surname");
                                User userObject = new User(firstName, userID, surname);
                                // cant call my callback right here otherwise its called for every
                                // completed user fetch
                            }
                        });
                        // cant call my callback right here since its too early
                    }
                }else if(task.isCanceled()){
                    System.out.println("Fetch failed!");
                }
            }
        });
    }
...