Предотвращение дублирования имен пользователей, вызывающих поток 1: сигнал SIGABRT - PullRequest
0 голосов
/ 07 января 2019

После нажатия кнопки «Зарегистрироваться» приложение должно запустить функцию, в которой оно проверяет, занято ли введенное пользователем имя пользователя. Если это так, он остановит процесс «создания учетной записи» и скажет пользователю ввести другое имя пользователя.

Однако, после ввода того же имени пользователя и нажатия кнопки регистрации, мое приложение вылетает с ошибкой Thread 1: signal SIGABRT. Строка ошибки прокомментирована ниже.

Буду очень признателен, если кто-нибудь сможет мне помочь.

Файл базы данных JSON:

{
  "usernames" : {
    "itsandyjiang" : "0vFQYnfIbahHdC1RsuNMW45HYNR2"
  },
  "users" : {
    "0vFQYnfIbahHdC1RsuNMW45HYNR2" : {
      "email" : "andyjiang55@yahoo.com",
      "username" : "itsandyjiang"
    }
  }
}

Функция, проверяющая, вошел ли пользователь в имя пользователя, которое не занято:

 func isValidUsername(username: String) {
        let usernameRegex = ".{3,}"
        var valid = NSPredicate(format: "SELF MATCHES %@", usernameRegex).evaluate(with: username)

        if valid {
            valid = !username.contains("Invalid username id")
        }

        if valid == false {


            usernameLabel.textColor = UIColor.red
            usernameLabel.text = "USERNAME MUST BE AT LEAST 3 CHARS"
            usernameTextField.layer.addBorder(edge: UIRectEdge.bottom, color: UIColor.red, thickness: 1.5)

        } else {

            let ref = Database.database().reference(fromURL: "https://testapp-testtest.firebaseio.com/")
            let usernamesRef = ref.child("usernames")

            usernamesRef.observeSingleEvent(of: .value, with: { (snapshot) in
                let usernamesArray = Array(snapshot.value as! [String]) //ERROR LINE
                for storedUsername in usernamesArray {
                    if storedUsername == self.usernameTextField.text! {
                        self.usernameVerified = false
                        self.usernameLabel.textColor = UIColor.red
                        self.usernameLabel.text = "USERNAME TAKEN"
                        self.usernameTextField.layer.addBorder(edge: UIRectEdge.bottom, color: UIColor.red, thickness: 1.5)
                        return
                    }
                }
                self.usernameVerified = true
                self.usernameTextField.layer.addBorder(edge: UIRectEdge.bottom, color: UIColor.black, thickness: 1.5)
                self.usernameLabel.textColor = UIColor.black
                self.usernameLabel.text = "USERNAME"

            }) { (error) in
                print(error.localizedDescription)
            }

        }
    }

Функция, запускаемая после нажатия кнопки «Войти»:

   @IBAction func onSignUp(_ sender: Any) {

        isValidUsername(username: usernameTextField.text!)
        isValidEmail(email: emailTextField.text!)
        isValidPassword(password: passwordTextField.text!)

        if passwordVerified && emailVerified && usernameVerified {

            Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!) { (authResult, error) in
                if error != nil {
                    self.errorLabel.alpha = 1
                    self.errorLabel.text = error?.localizedDescription
                }

                guard let user = authResult?.user else {
                    return
                }


                //Successfully Authenticated User
                let ref = Database.database().reference(fromURL: "https://testapp-testtest.firebaseio.com/")
                let usersReference = ref.child("users").child(user.uid)
                let values = ["username": self.usernameTextField.text, "email": self.emailTextField.text]
                let usernamesReference = ref.child("usernames")
                let values2 = [self.usernameTextField.text!: user.uid]
                usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in
                    if err != nil {
                        print(err!)
                        return
                    }
                    //Successfully registered user's data to database
                    usernamesReference.updateChildValues(values2, withCompletionBlock: { (err, ref) in
                        if err != nil {
                            print(err!)
                            return
                        }

                        self.errorLabel.alpha = 0

                    })

                })
            }

        } else {

            errorLabel.alpha = 1
            print("Password/Email/Username verification not complete!")

        }

    }

1 Ответ

0 голосов
/ 07 января 2019

Вам нужно привести его к словарю, как подразумевается в прилагаемом json

 let con = snapshot.value as! [String:Any]
 let usernamesArray =  Array(con.keys)

также есть дубликаты в вашей текущей схеме, поэтому рассмотрите возможность установки всех пользовательских данных внутри 1 таблицы и не разделяйте их, может быть, это только

{ 
  "users" : {
    "0vFQYnfIbahHdC1RsuNMW45HYNR2" : {
      "email" : "andyjiang55@yahoo.com",
      "username" : "itsandyjiang"
    }
  }
}

Тогда

   let ref = Database.database().reference(fromURL: "https://testapp-testtest.firebaseio.com/")
   let usernamesRef = ref.child("users")

      usernamesRef.observeSingleEvent(of: .value, with: { (snapshot) in
      let con = snapshot.value as! [String:[String:Any]]
      var usernamesArray = [String]()
      Array(con.keys).forEach {
         if let res = con[$0] , let username = res["username"] as? String {
           usernamesArray.append(username)
         }
      }
      // after that check whether exists / not 

  ---
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...