Как структурировать код при слишком большом количестве событий android - PullRequest
1 голос
/ 03 апреля 2020

Я новичок в Firestore и изучаю Android. Проблема, с которой я сталкиваюсь, заключается в структурировании кода. Ниже приведен мой вариант использования:

  1. Пользователь хочет добавить новую заметку, вводит заголовок заметки
  2. Я хочу проверить, существует ли какая-либо другая заметка с таким же названием
  3. Если да, то не разрешать, иначе создать

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

// BEFORE
private boolean fnValidate() {
    // some code...

    // run Sqlite query and get data in a list or something

    // check if exists, return accordingly
}

// NOW
private boolean fnValidate() {
    // some code...

    notesRef.get().addOnSuccessListener(queryDocumentSnapshots -> {
        for (QueryDocumentSnapshot s : queryDocumentSnapshots) {
            // add data to list or something
        }

        // 'exists logic' will go here??

    }).addOnFailureListener(e -> {
        // show error
    });

    // I want 'exists logic' here like it was earlier so that I can properly return true/false
}

Теперь, как вы можете видеть, это не будет работать последовательно. Он запустит задачу, чтобы получить заметки, и продолжит. Поэтому мне нужно добавить свой exists logic в OnSuccessListener.

Кроме того, в будущем, если мне придется проверять какое-либо другое значение перед моим exists logic, мне снова придется перемещаться exists logic в пределах этого условия OnSuccessListener и так далее.

Кроме того, откуда вернуть значение true / false первоначальному вызывающему объекту fnValidate?

Может быть, я упускаю что-то очевидное здесь, но я очень смущен тем, как идеальная структура должна быть. Пожалуйста, скажите мне, каковы лучшие практики здесь.

1 Ответ

1 голос
/ 03 апреля 2020

Поэтому мне нужно добавить свои существующие логи c в OnSuccessListener.

Да, когда onSuccess() срабатывает, это означает, что вы на 100% уверены, что Операция получения данных из базы данных выполнена на 100% успешно, и вы можете использовать эти данные по мере необходимости. Вам всегда нужно ждать данных.

Более того, в будущем, если мне придется проверять какое-то другое значение до того, как мои существующие логи c, мне снова придется перемещать существующие логи c внутри OnSuccessListener этого условия и т. Д.

Да, так работает асинхронное программирование.

Кроме того, откуда вернуть значение true / false в оригинал вызывающая сторона fnValidate?

Невозможно вернуть данные (fnValidate) в результате использования метода. Для рабочего решения, смотрите мой ответ из следующего поста:

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