如何在Uibutton中快速运行异步功能

时间:2019-08-29 13:25:24

标签: ios swift

我希望getUserToken函数和userLogin函数在Firebase身份验证的下一行之前运行。为了使其异步运行

    @IBAction func loginButtonPressed(_ sender: UIButton) {


    self.showSpinner(onView: self.view)

    guard var phoneNumber = phoneTextField.getRawPhoneNumber()    else { return }
    phoneNumber = "+234\(phoneNumber)"

    guard var userPhoneNumber = phoneTextField.getRawPhoneNumber()  else { return }
    userPhoneNumber = "234\(userPhoneNumber)"

    guard let userName = nameTextField.text else {return}
    print(phoneNumber) 
    getUserAcessToken()
    userLogin()

    //Validate Required fields are mnot empty
    if nameTextField.text == userName  {

        //Firebase Manipulation
        PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationId, error) in
            if error == nil {

                print(verificationId!)

                //UserDefaults Database manipulation for  Verification ID
                guard let verifyid = verificationId else {return}
                self.defaults.set(verifyid, forKey: "verificationId")
                self.defaults.synchronize()


                self.removeSpinner()
            }else {

                print("Unable to get secret verification code from   Firebase", error?.localizedDescription as Any)

                let alert = UIAlertController(title: "Please enter correct email and phone  number", message: "\n", preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
                self.present(alert, animated: true, completion: nil)
                return

            }


        }

    }
    let OTPRequestVC =   storyboard?.instantiateViewController(withIdentifier: "OTPRequestViewController") as! OTPRequestViewController
    OTPRequestVC.userId = userId
    OTPRequestVC.userEmailData = userEmail
    self.present(OTPRequestVC, animated: true)

}

我希望这两个函数在firebase身份验证之前异步运行。

2 个答案:

答案 0 :(得分:0)

在主线程上运行耗时的函数不是一个好主意。 我的建议是。

  1. getUserAcessToken()和userLogin()函数应具有回调。这将使这些函数在不同的线程上运行(我相信那些函数正在通过后台线程完成api调用)
  2. 您可以在getUserAcessToken()的完成处理程序中调用userLogin(),然后在getUserAcessToken()的完成处理程序中调用firebaseAuth。

这将确保在您进行这些api调用之前,UI不会挂起,并且用户将知道应用程序中发生了某些事情并且该应用程序未挂起。

答案 1 :(得分:0)

在不再现全部预期功能的情况下,您要遵循的模式是:

a<t-3>