0

我正在尝试构建一个注册视图,以验证我的 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

4

1 回答 1

1

你的代码:

  1. 加载所有用户文档
  2. 循环遍历这些文档
  3. 如果找到任何具有不同名称的文档,则为该用户编写一个新文档

因此,只要有任何名称与您尝试添加的用户不同的用户,您就可以为该用户添加一个文档。如果没有文档与新用户的名称匹配,您的用例似乎是仅添加一个新文档。

有两种方法可以做到这一点:

  1. 使用布尔变量检查是否找到匹配的名称,如果找到匹配项,则将其设置为true循环中。然后在循环之后,仅当变量仍然为 false 时才添加新文档。

  2. 使用查询仅加载具有新用户输入的用户名的文档。

虽然 #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)
                    }
                }
            }
        }
    }
}

另见:

于 2020-02-02T16:32:15.507 回答