ios - 如何在 swift 中的 Uibutton 中运行异步函数
问题描述
我希望 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 身份验证之前异步运行。
解决方案
在不复制整个预期功能的情况下,您要遵循的模式是:
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
}
}
}
}
推荐阅读
- javascript - 如何防止单击 SelectableList 中的元素触发 onChange?
- c++ - 在 Visual Studio 中将 OpenMP 与 Clang 和 CMake 结合使用
- javascript - 如何在本地计算机上运行项目?
- c++ - 队列的验证层错误:QueueFamilyIndex 在 pCreateInfo->pQueueCreateInfos 数组中不是唯一的
- php - 用于在同一个域中运行两个 Yii2 php 实例的 Nginx 配置
- python - 遍历关键字/函数的最有效方法是什么?
- angular5 - Angular 5 build with --aot Module not found - @angular/platform-browser
- php - 为什么 Laravel 中的新路线不起作用?
- python - 如何在python中打开已经打开的文件?
- ios - ARGB 图像的 CGContext.init 返回 nil