Метод продолжается, даже если данные все еще загружаются из Cloud Firestore - PullRequest
0 голосов
/ 09 марта 2020

У меня есть проблема в моем приложении, где у меня есть метод с именем signUpButtonTapped:

 @objc func signUpButtonTapped(_ sender: Any) {


    if !areFieldsValid()! {
        // some error in textfield
        theScrollView.scrollToTop()
    }else { /* create user */ }

Как вы можете видеть, я вызываю метод areFieldsValid(), который проверяет все мои textFields на пару вещей, включая то, не взято ли имя пользователя или нет:

//MARK: Validate Fields
func areFieldsValid() ->Bool? {

    var isValid = true

    // check if username is valid
    checkUsername(field: usernameTextField.text!) { (success) in
        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"
            isValid = false
        }
    }

    return isValid
}

Проблема, с которой я столкнулся, заключается в том, что пользователь создается, даже если имя пользователя уже занято и areFieldsValid должно фактически вернуть false, но программа все еще продолжается ... Я думаю, это потому, что данные все еще загружаются во время работы программы? Я понятия не имею, как решить эту проблему, поэтому я благодарен за любую помощь!

1 Ответ

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

Ваш звонок в сеть асинхронный , это означает, что он может завершиться sh в любое время в будущем. Асинхронные вызовы просто начинают выполняться и сразу же возвращаются, вызывая блок завершения (в вашем случае с логическим флагом success), когда они заканчиваются sh.

В этом случае ваше определение areFieldsValid() не правильно, так как он ожидает вернуть результат асинхронного вызова (который немедленно возвращается). Ваша проверяющая функция должна иметь закрытие завершения для обработки чего-либо, например:

func validateFields(completion: @escaping (Bool) -> Void) {
    checkUsername(field: usernameTextField.text!) { success in
        if success {
            // username is taken
            print("Username is taken")
            self.setupUsernameTextField()
            self.checkUsernameImage.image = UIImage(named: "false")
            self.checkUserNameLabel.text = "Benutzername ist bereits vergeben"
            self.isValid = false
        }

        completion(success) // call the completion closure with the success status
    }
}

Так что вы бы назвали это так:

@objc func signUpButtonTapped(_ sender: Any) {
    validateFields { areValid in
        if areValid {
            self.theScrollView.scrollToTop()
        } else {
            // create user
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...