使用任务从Firestore大量读取文档参考

时间:2019-06-23 15:27:42

标签: android firebase google-cloud-firestore

我有一份从Firestore中读取的参考地图。这些引用使我找到了一些文档,我愿意使用它们的数据来创建类“ Contact”的实例。

为此,我创建了一个任务列表,该任务的每个任务都使用其引用从Firestore中读取并检索所需的数据。

一旦全部完成,我将使用Tasks.whenAll(tasks).addOnSuccessListener()来检索我的新联系人列表。

在此方法中,“联系人”为空,而“数据”中充满了文档引用。 我希望Tasks.whenAll(tasks)仅在使用refs进行的所有读取完成后才被调用,但是它会立即被调用,因此-没有任何反应。

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 个答案:

答案 0 :(得分:1)

您使用的API错误。您应该将get()返回的任务收集到一个数组中,而不是立即向每个回调中添加一个回调。将该任务列表传递给Tasks.whenAll()。然后,在Tasks.whenAll返回的任务的回调中,您可以检查每个DocumentSnapshot结果。