Как организовать проверку в базе данных Firebase на уникальность введенных пользователем данных?

Приветствую, несколько недель начал изучать разработку под iOS и при создании своего первого приложения нужно было решить вопрос с реализацией "Авторизации пользователей"

Для этих целей я выбрал Firebase, и в целом все шло изначально хорошо, хотя и много кто грешит на этот сервис работать с ним мне показалось достаточно удобно и приятно (Возможно из-за того, что я еще не применял других решений, не знаю)

И тут встал такой вопрос, ведь при регистрации пользователя я сохраняю его email и логин в базу данных, и нужно было настроить некий метод, который при нажатии на кнопку "регистрация" будет проверять, что такой email и логин не находятся в базе данных, и только после этого идти дальше.

поизучав документацию Firebase и просмотрел некоторые видео по данному сервису я постарался решить эту задачу следующим образом:

// создаем метод, в который будем передавать введенный email и комплишнХандлер для обработки
private func isNewEmail(_ email: String, completion: _ emailIsNew: Bool -> ()) {
     
      ref = Database.database().reference(withPath: "users")
      // методом Firebase получаем данные из базы
      ref.getData { error, snapshot in
            // значение, которое отвечает за "новизну" email. Если true - значит такого email еще нет в базе.
            var emailIsNew: Bool = true
     
            guard error == nil else { return }
            
            // получаем значение из нашего снэпшота и пытаемся скастить до словаря 
            guard let snapshotValue = snapshot.value as? [String : AnyObject] else {
                 // если у нас база пустая, значение будет nil, а значит любой email будет уникальным и можно передавать в 
                 // хэндлер нашу переменную, созданную выше, со значением true (установлено по умолчанию
                 if snapshot.value as? [String : AnyObject] == nil {
                        completion(emailIsNew)
                        return
                  }
                  return
            }

            // запускаем цикл, где обрабатываем наши словари (т.к. snapshot.value вернет словарь словарей
            for item in snapshotValue {
            
                  let itemValueDictionary = item.value
            
                  guard let emailFromDatabase = itemValueDictionary["email"] as? String else { return }
                  // тут мы сравниваем наши емайлы,  если совпадение есть, меняем нашу переменную на false и делаем brake
                  if email.lowercased() == emailFromDatabase.lowercased() {
                 
                        emailIsNew = false
                        break
                  }
            }
            // после цикла передаем в хэндлер наше значение переменной выше
            completion(emailIsNew)
      }
}


Дальше мы соответственно вызываем метод, описанный выше, и передаем туда email, и в зависимости от значения emailIsNew уже создаем или не создаем юзера.

*SMALL MARK - т.к. я изучаю все не так давно, в коде я очень много комментирую сам для себя, для тру программистов это может показать немного смешным, но так на самом деле проще воспринимать и запоминать информацию и использованные решения

Самая главная проблема: Я предположил, что если у нас в базе данных к примеру 10.000 user'ов, то такая проверка может занимать очень долгое время, мне кажется что когда человек нажимает "Регистрация" и после этого ждет 10 минут пока приложение все проверит - это недопустимо, поэтому я постарался найти другой способ решения изначальной проблемы, но к сожалению, найти его мне не удалось ввиду, полагаю, малого количества опыта. Прошу подсказать как решить данную проблему, как можно изменить метод проверки, или вообще, возможно, применить что-то другое.
  • Вопрос задан
  • 649 просмотров
Пригласить эксперта
Ответы на вопрос 2
alexgp13
@alexgp13
Руководитель ИТ-проектов
А зачем перебирать записи в цикле? Firebase разве не умеет работать с отбором (where)? Вроде как любая база данных, должна поддерживаться соответствующая инструкция, Вы за доли секунды получите только запись с нужным e-mail (или пустой ответ), даже если в базе несколько миллионов пользователей.
p.s. с Firebase я не работал, но здравый смысл и Google подсказывают, что поиск в базе поддерживается.
Ответ написан
Zoominger
@Zoominger
System Integrator
Не скажу за FireBase, но в таких случаях обычно делают такой столбец уникальным и на стороне приложения отлавливают исключение "Record already exists". Пойдёт?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы