簡體   English   中英

如何在Uibutton中快速運行異步功能

[英]How to run Asynchronous function in a Uibutton in 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 auth之前異步運行。

在主線程上運行耗時的函數不是一個好主意。 我的建議是。

  1. getUserAcessToken()和userLogin()函數應具有回調。 這將使這些函數在不同的線程上運行(我相信那些函數正在進行api調用,而這是在后台線程中完成的)
  2. 您可以在getUserAcessToken()的完成處理程序中調用userLogin(),然后在getUserAcessToken()的完成處理程序中調用firebaseAuth。

這將確保在您進行這些api調用之前,UI不會掛起,並且用戶將知道應用程序中正在發生某些事情並且該應用程序未掛起。

在不重現全部預期功能的情況下,您要遵循的模式是:

func loginButtonPressed(_ sender: UIButton) {
    // Any immediate changes to the UI here
    // ...

    // Start time consuming task in background
    DispatchQueue.global(qos: .userInitiated).async {
        getUserAccessToken()
        userLogin()

        // Make your Firebase call
        PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationId, error) in

            // Any response validation here
            // ...

            DispatchQueue.main.async {
                // Any UI updates here

            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM