var ref: DatabaseReference { return Database.database().reference() }
var usernamesRef: DatabaseReference { return ref.child("usernames") }
Перед созданием пользователя необходимо проверить, занято ли имя пользователя.
func checkExistingUsernames(forUsername username: String, withExists: @escaping (Bool) -> ()) {
usernamesRef.child(username).observeSingleEvent(of: .value, with: { (snapshot) in
withExists(snapshot.exists())
})
}
Затем вы можете обновить имена пользователей и данные вновь созданного пользователя.
func createUserDetails(forUser user: User, withUsername username: String, completion: @escaping (Error?) -> ()) {
ref.updateChildValues([
"usernames/\(username)": user.uid,
"users/details/\(user.uid)": [
"username" : username,
"email" : user.email,
"creationDate" : String(describing: Date())
]
]) { (error, ref) in
completion(error)
}
}
Таким образом, мы проверяем, существует ли имя пользователя, и создаем пользователя, и его данные, если имя пользователя свободно,
class UsernameAlreadyExistsError: Error {}
func createUser(withUsername username: String, email: String, password: String, completion: @escaping (User?, Error?) -> ()) {
checkExistingUsernames(forUsername: username) { [weak self] alreadyExists in
if alreadyExists {
completion(nil, UsernameAlreadyExistsError())
} else {
Auth.auth().createUser(withEmail: email, password: password) { [weak self] (result, error) in
if let user = result?.user {
self?.createUserDetails(forUser: user, withUsername: username) { (error) in
completion(user, error)
}
} else {
completion(nil, error)
}
}
}
}
}
Наконец, в вашем действии сохранения вы можете позвонить createUser
.
let saveAction = UIAlertAction(title: "Crear Cuenta", style: .default) { [weak self] action in
guard
let email = alert.textFields?[0].text,
let username = alert.textFields?[1].text,
let password = alert.textFields?[2].text else { return }
self?.createUser(withUsername: username, email: email, password: password) { (user, error) in
if let error = error {
print("create user", error)
} else if let user = user {
print("user created", user)
}
}
}