Firestore Swift 5: проверка, если существуют данные имени пользователя документа - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь создать представление регистрации, в котором я пытаюсь проверить, существует ли значение имени пользователя в моей базе данных Firestore. У меня есть другая функция, которая проверяет мои текстовые поля, но я просто не могу понять, почему эта функция все еще выполняет переход после моего условного оператора, чтобы проверить, существует ли имя пользователя в базе данных.

Любой совет и улучшения будут высоко ценится, как я новичок в 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

1 Ответ

1 голос
/ 02 февраля 2020

Ваш код:

  1. Загружает все пользовательские документы
  2. Зацикливает эти документы
  3. Записывает новый документ для этого пользователя, если находит любой документ с другим именем

Так что, как только есть пользователь, имя которого отличается от того, которое вы пытаетесь добавить, вы добавляете документ для пользователя. Похоже, ваш вариант использования заключается в добавлении нового документа, только если нет документов соответствует имени нового пользователя.

Есть два способа сделать это:

  1. Используйте булеву переменную, чтобы проверить, найдено ли совпадающее имя, установите его на true в l oop, если вы найдете совпадение. Затем после l oop добавьте новый документ только в том случае, если переменная все еще имеет значение false.

  2. Используйте запрос для загрузки документов только с тем именем пользователя, которое ввел новый пользователь.

Хотя № 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)
                    }
                }
            }
        }
    }
}

Также см .:

...