Проверьте, есть ли имя пользователя в базе данных Firestore при редактировании UITextField - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь проверить, не занято ли имя пользователя, пока пользователь вводит имя. В настоящее время у меня есть эти две функции, которые работают почти так, как я хотел бы, чтобы они работали, но не на 100% правильно:

textFieldDidChange:

 @objc private func textFieldDidChange(_ textField: UITextField) {

    switch textField {

    // ... //    
    case usernameTextField:
        if textField.text?.isEmpty == false {
            checkUsername(field: textField.text!) { (success) in
                print(textField.text!)
                if success == true {
                    // username is taken
                    print("Username is taken")
                    self.setupUsernameTextField()
                    self.checkUsernameImage.image = UIImage(named: "false")
                    self.checkUserNameLabel.text = "Benutzername ist bereits vergeben"
                } else {
                    // username is not taken
                    print("Username is not taken")
                    self.checkUsernameImage.image = UIImage(named: "correct")
                    self.checkUserNameLabel.text = "gültiger Benutzername"
                }
            }
        }else {
            self.checkUsernameImage.image = UIImage(named: "false")
            self.checkUserNameLabel.text = "kein gültiger Benutzername"
        }
    default:
        break
    }

}


// helper function to check if username is in databse -> later in Datahandler
func checkUsername(field: String, completion: @escaping (Bool) -> Void) {

    let db = Firestore.firestore()
    let collectionRef = db.collection("users")
    collectionRef.whereField("username", isEqualTo: field).getDocuments { (snapshot, err) in
        if let err = err {
            print("Error getting document: \(err)")
        } else if (snapshot?.isEmpty)! {
            completion(false)
        } else {
            for document in (snapshot?.documents)! {
                if document.data()["username"] != nil {
                    completion(true)
                }
            }
        }
    }
}

Проблема: Если вы набираете что-то довольно быстро или если ваше соединение inte rnet не очень хорошее, оно отображает Username is not taken, когда оно действительно есть.

Если вы посмотрите на Instagram-приложение, они делают это идеальным способом:

  1. введите что-то, даже быстрое
  2. после того, как вы перестанете печатать, возможно, через секунду появляется loading indicator, и только после этого вы получаете обратную связь, если имя пользователя не занято
  3. введите что-то, пока loading indicator активен, он останавливается и запускается снова, если вы перестанете печатать снова.

Мой вопрос: как я это понимаю ??? Например, как узнать, когда пользователь «прекращает» печатать, но textField по-прежнему editing? Я попробовал это с shouldEndEditing, но это работает, только если textfield больше не выбран, и это не то, чего я хотел бы достичь. В конце я хотел бы иметь тот же процесс, что и в приложении Instagram.

Любые идеи о том, как это реализовать ??

1 Ответ

1 голос
/ 05 марта 2020

С предложением @Jays я смог заставить его работать:

Мой textField связан с методом didChange, который выглядит следующим образом:

timer.invalidate() // reset timer

// start the timer
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)

И подключенный timerAction -метод выглядит так:

// called every time interval from the timer
@objc func timerAction() {
    checkUsername(field: usernameTextField.text!) { (success) in
        print(self.usernameTextField.text!)
        if success == true {
            // username is taken
            print("Username is taken")
            self.setupUsernameTextField()
            self.checkUsernameImage.image = UIImage(named: "false")
            self.checkUserNameLabel.text = "Benutzername ist bereits vergeben"
            // stop timer
            self.timer.invalidate()
        } else {
            // username is not taken
            print("Username is not taken")
            // stop timer
            self.timer.invalidate()
        }
    }
}

Работает именно так, как я хочу, чтобы он работал, спасибо за помощь:)

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