代码之家  ›  专栏  ›  技术社区  ›  Chris

方法继续,即使数据仍从CloudFireStore加载

  •  0
  • Chris  · 技术社区  · 6 年前

    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 我猜是因为程序运行时数据还在加载?我不知道如何解决这个问题,所以我非常感谢每一个帮助!

    0 回复  |  直到 6 年前
        1
  •  1
  •   Alejandro Iván    6 年前

    你的网络呼叫是 异步 ,这意味着它可以在未来的任何时候完成。异步调用只是开始运行并立即返回,调用一个完成块(在您的情况下,使用 success

    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
            }
        }
    }