Умножьте чтение ссылок на документы из Firestore, используя задачи - PullRequest
1 голос
/ 23 июня 2019

У меня есть Карта ссылок, которую я прочитал в Firestore.эти ссылки приводят меня к документам, которые я готов использовать их данные для создания экземпляра моего класса «Контакт».

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

Как только все это сделано, я использую Задачи.whenAll (задачи) .addOnSuccessListener (), желающий получить мой новый массив контактов.

В этом методе «контакты» пустые, а «данные» полны ссылок на документы.Я ожидал, что Tasks.whenAll(tasks) будет вызываться только тогда, когда все чтение с использованием ссылок завершено, однако вызывается немедленно, поэтому - ничего не происходит.

private void createContactArray(final ArrayList<Contact> contacts, final Map<String, DocumentReference> data) {
        List<Task<DocumentSnapshot>> tasks = new ArrayList<>();
        for (final Map.Entry<String, DocumentReference> entry : data.entrySet()) {
            tasks.add(db.document(entry.getValue().getPath()).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if (task.isSuccessful()) {
                        DocumentSnapshot document = task.getResult();
                        if (document.exists()) {
                            Map<String,String> contactDetails = (Map<String, String>) document.getData().get(entry.getKey());
                            Contact contact = createContact(contactDetails);
                            if(contact != null){ contacts.add(contact);}

                        } else {
                            Log.d(ACTION_FETCH_CONTACT_LIST,"There was ref problem with " + entry.getKey());
                        }
                    }else {
                        Log.d(ACTION_FETCH_CONTACT_LIST, "get failed with ", task.getException());
                    }
                }
            }));
        }
        Tasks.whenAll(tasks).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                sendBroadcastActionContactList(contacts);
            }
        });

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

Я действительно ценю вашу помощь!

1 Ответ

1 голос
/ 24 июня 2019

Вы используете API неправильно.Вы должны собирать задачи, возвращаемые get() в массив, вместо того, чтобы сразу добавлять обратный вызов к каждому.Передайте этот список задач в Tasks.whenAll ().Затем в обратном вызове для задачи, возвращаемой Tasks.whenAll, вы можете просмотреть результаты каждого DocumentSnapshot.

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