Я пытаюсь реализовать проверку имени пользователя в Firestore в моем приложении. У меня есть функция validateTextFields, которая возвращает логическое значение, если проверка текстового поля проходит / не проходит. Я реализую функцию checkUsername, которая использует асинхронные вызовы Firebase для Firestore, чтобы проверить, уникально ли имя пользователя:
func checkUsername(field: String, closure: (Bool) -> Bool) {
let collectionRef = self.db.collection("Users")
withoutActuallyEscaping(closure) { [weak self] escapableSnapshot in
guard self != nil else {return}
collectionRef.whereField("username", isEqualTo: field).getDocuments { (escapableSnapshot, err) in
if let err = err {
print("Error getting document: \(err)")
} else if (escapableSnapshot?.isEmpty)! {
print("completion is false")
//completion(false)
} else {
for document in (escapableSnapshot?.documents)! {
if document.data()["username"] != nil {
print("completion is true")
}
}
}
}
}
}
Я обрабатываю возврат Bool
в моей функции validateTextFields()
:
checkUsername(field: (usernameTF.text!).lowercased()) { (exists) in
print(exists)
if exists {
print("Username is taken")
usernameIsTaken = true
}
else {
print("Username is available")
}
return true
}
if usernameIsTaken { return false }
print("printing out username", usernameIsTaken)
Я пробовал semaphores
и withoutActuallyEscaping(closure)
, но ни один не помог. Мне интересно, правильно ли я использую функцию withoutActuallyEscaping()
, если есть менее хакерский способ сделать это. Если я не понимаю, функция withoutActuallyEscaping
- это именно то, что нужно для этого.
Конечной целью было бы проверить, не занято ли уже имя пользователя в Firestore, и вернуть false, чтобы не выполнять функцию регистрации, и отобразить сообщение об ошибке для пользователя.