Firebase Query Threads и удаление нескольких документов - PullRequest
0 голосов
/ 11 мая 2018

У меня есть 2 проблемы:

Первая:

Я хочу вызвать doSomethingOnce() при удалении всего объекта, но мне нужно, чтобы он вызывался только один раз, поэтому //Position1 это не место для вызова, потому что оно в цикле, поэтому его будут вызывать несколько раз.//Position2 тоже не работает, потому что из того, что я понял и протестировал с логами, он вызывается перед завершением удаления.Как вызвать функцию, когда все удаление завершено?

Второй:

Удаление нескольких документов на самом деле не работает таким образом..delete() выполняется максимум 3 раза в цикле, поэтому, когда у меня, скажем, 15 документов, мне нужно вызвать этот цикл for(String id : Ids) с удалением 5 раз.Как я могу удалить больше, чем эти 3 документа?

FirebaseFirestore.getInstance().collection("test")
    .whereEqualTo("userID", user.getUid())
    .get()
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if(task.isSuccessful()){
                if(task.getResult().size() > 0) {
                    List<String> Ids = new ArrayList<>();
                    for(QueryDocumentSnapshot documentSnapshot : task.getResult()) {
                        Ids.add(documentSnapshot.getId());
                    }

                    for(String id : Ids) {
                        FirebaseFirestore.getInstance().collection("test").document(id).delete().addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {

                                //Position1
                                Toast.makeText(SettingsActivity.this, "Deleted", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }

                    //Position2
                } else {
                    Toast.makeText(SettingsActivity.this, "Nothing found", Toast.LENGTH_SHORT).show();
                }
            } else {
                Toast.makeText(SettingsActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();
            }
        }
    });

1 Ответ

0 голосов
/ 11 мая 2018

Когда вы звоните Document.delete(), вы получаете задание.Чтобы выполнить определенную работу после завершения ряда задач, используйте Tasks.whenAll(...).

Task<Void> Tasks.whenAll(Task...<?> tasks)

Так что-то вроде:

ArrayList<Task<Void>> tasks = new ArrayList<Task<Void>>();
for(String id : Ids) {
    tasks.add(FirebaseFirestore.getInstance().collection("test").document(id).delete());
}
Tasks.whenAll(tasks).addOnSuccessListener(new OnSuccessListener<Void>() {
    @Override
    public void onSuccess(Void aVoid) {
        Toast.makeText(SettingsActivity.this, "Deleted", Toast.LENGTH_SHORT).show();
    }
});

Я рекомендую прочитать серию блогов Дуга * на "стать мастером задачи ".

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