Ваш код:
- Загружает все пользовательские документы
- Зацикливает эти документы
- Записывает новый документ для этого пользователя, если находит любой документ с другим именем
Так что, как только есть пользователь, имя которого отличается от того, которое вы пытаетесь добавить, вы добавляете документ для пользователя. Похоже, ваш вариант использования заключается в добавлении нового документа, только если нет документов соответствует имени нового пользователя.
Есть два способа сделать это:
Используйте булеву переменную, чтобы проверить, найдено ли совпадающее имя, установите его на true
в l oop, если вы найдете совпадение. Затем после l oop добавьте новый документ только в том случае, если переменная все еще имеет значение false.
Используйте запрос для загрузки документов только с тем именем пользователя, которое ввел новый пользователь.
Хотя № 1 наиболее близок к существующему коду, требуется загрузить все пользовательские документы. Это будет становиться все медленнее и медленнее, поскольку ваше приложение получает больше пользователей, поэтому не рекомендует. Я вместо этого go с подходом # 2 и использовал бы запрос.
Это выглядело бы примерно так:
db.collection("Users")
.whereField("username", isEqualTo: username)
.getDocuments { (querySnapshot, error) in
if let error = error {
print("Error connecting to database")
}
else {
if querySnapshot.isEmpty {
let userID = Auth.auth().currentUser!.uid
if let name = self.nameField.text, let email = self.emailTextField.text, let username = self.usernameTextField.text {
self.db.collection("Users").document("\(userID)").setData(["name":name,"email":email, "username":username, "accountBalance": 0]) { (error) in
if error != nil {
print("Error saving data")
}
else {
self.performSegue(withIdentifier: "signedUp", sender: self)
}
}
}
}
}
}
Также см .: