Firestore Swift 5:验证文档用户名数据是否存在
Firestore Swift 5: Validating if document username data exists
我正在尝试构建一个注册视图,以验证我的 Firestore 数据库中是否存在用户名值。我有另一个函数可以验证我的文本字段,但我似乎无法弄清楚为什么这个函数在我的条件语句之后仍然执行 segue 以验证用户名是否存在于数据库中。
任何建议和改进都将不胜感激,因为我是 Swift 的新手。 :)
func signUpUser () {
db.collection("Users").getDocuments { (querySnapshot, error) in
if let error = error {
print("Error connecting to database")
}
else {
if let snapshotDocuments = querySnapshot?.documents {
for doc in snapshotDocuments {
let data = doc.data()
if let username = data["username"] as? String{
let usernameImput = self.usernameTextField.text
if usernameImput == username {
print("Username not available")
}
else if usernameImput != username {
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 {
// MARK: ERROR POPUP
print("Error saving data")
}
else {
self.performSegue(withIdentifier: "signedUp", sender: self)
}
}
}
print("Sign Up Successfully.")
}
else {
print("Other problems")
}
}
}
}
}
}
}
非常感谢您的帮助或贡献。 :D
您的代码:
- 加载所有用户文档
- 遍历这些文档
- 如果找到 任何 具有不同名称的文档,则为该用户写一个新文档
因此,只要有任何用户的名称与您要添加的用户的名称不同,您就会为该用户添加一个文档。看来您的用例是仅在 none 的文档与新用户的名称匹配时才添加新文档。
有两种方法可以做到这一点:
使用布尔变量检查是否找到匹配的名称,如果找到匹配,则在循环中将其设置为 true
。然后在循环之后,如果变量仍然为假,则只添加新文档。
使用查询仅加载具有新用户输入的用户名的文档。
虽然 #1 最接近您现有的代码,但它要求您加载所有用户文档。随着您的应用获得更多用户,这会变得越来越慢,因此不推荐。相反,我会采用方法 #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)
}
}
}
}
}
}
另见:
- swift firestore check if documents exists(显示如何使用 "claimed user names" 创建单独的集合)。
我正在尝试构建一个注册视图,以验证我的 Firestore 数据库中是否存在用户名值。我有另一个函数可以验证我的文本字段,但我似乎无法弄清楚为什么这个函数在我的条件语句之后仍然执行 segue 以验证用户名是否存在于数据库中。
任何建议和改进都将不胜感激,因为我是 Swift 的新手。 :)
func signUpUser () {
db.collection("Users").getDocuments { (querySnapshot, error) in
if let error = error {
print("Error connecting to database")
}
else {
if let snapshotDocuments = querySnapshot?.documents {
for doc in snapshotDocuments {
let data = doc.data()
if let username = data["username"] as? String{
let usernameImput = self.usernameTextField.text
if usernameImput == username {
print("Username not available")
}
else if usernameImput != username {
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 {
// MARK: ERROR POPUP
print("Error saving data")
}
else {
self.performSegue(withIdentifier: "signedUp", sender: self)
}
}
}
print("Sign Up Successfully.")
}
else {
print("Other problems")
}
}
}
}
}
}
}
非常感谢您的帮助或贡献。 :D
您的代码:
- 加载所有用户文档
- 遍历这些文档
- 如果找到 任何 具有不同名称的文档,则为该用户写一个新文档
因此,只要有任何用户的名称与您要添加的用户的名称不同,您就会为该用户添加一个文档。看来您的用例是仅在 none 的文档与新用户的名称匹配时才添加新文档。
有两种方法可以做到这一点:
使用布尔变量检查是否找到匹配的名称,如果找到匹配,则在循环中将其设置为
true
。然后在循环之后,如果变量仍然为假,则只添加新文档。使用查询仅加载具有新用户输入的用户名的文档。
虽然 #1 最接近您现有的代码,但它要求您加载所有用户文档。随着您的应用获得更多用户,这会变得越来越慢,因此不推荐。相反,我会采用方法 #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)
}
}
}
}
}
}
另见:
- swift firestore check if documents exists(显示如何使用 "claimed user names" 创建单独的集合)。