Приветствую, несколько недель начал изучать разработку под 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 минут пока приложение все проверит - это недопустимо, поэтому я постарался найти другой способ решения изначальной проблемы, но к сожалению, найти его мне не удалось ввиду, полагаю, малого количества опыта. Прошу подсказать как решить данную проблему, как можно изменить метод проверки, или вообще, возможно, применить что-то другое.