在使用alamofire发送POST请求以在我的应用程序中注册用户之后,我尝试从我的服务器返回的user_id创建一个User对象。但是,当我尝试在初始化后直接打印此用户对象的某些属性时,它可以正常工作。但是,当我在alamofire post请求完成执行后尝试打印它的一些属性时,我收到了nil。
import UIKit
import Alamofire
class ViewController: UIViewController {
var user: User!
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var emailField: UITextField!
@IBOutlet weak var phone_number_field: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
//MARK: Actions
@IBAction func generateQR(_ sender: UIButton) {
let name = nameField.text
let email = emailField.text
let phone_number = phone_number_field.text
let params: Parameters = ["name": name!, "email": email!, "phone_number": phone_number!]
AF.request("http://127.0.0.1:5000/register", method: .post, parameters: params, encoding: JSONEncoding.default).responseString { response in
switch response.result {
case .success:
let user_id = response.result.value
self.user = User(name: name!, email: email!, phone_number: phone_number!, user_id: user_id!)
print(self.user?.name) // <--This print statement works correctly -->
case .failure:
print("Error")
}
}
print(self.user?.name) // <--This prints nil and in the debugger, self.user shows as nil-->
performSegue(withIdentifier: "qrSegue", sender: self)
}
//END Actions
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.destination is QRCodeController {
//Pass user object
let qr_controller = segue.destination as? QRCodeController
qr_controller?.user = self.user
}
}
}
您的服务电话是异步的。阅读有关同步和异步方法的信息。
AF向服务器发送请求,下面的代码继续工作。当您的响应到达时,成功或失败块将开始工作。
因此,在成功块运行之前,不会分配用户对象。
这是解决方案:
AF.request("http://127.0.0.1:5000/register", method: .post, parameters: params, encoding: JSONEncoding.default).responseString { response in
switch response.result {
case .success:
let user_id = response.result.value
self.user = User(name: name!, email: email!, phone_number: phone_number!, user_id: user_id!)
print(self.user?.name) // <--This print statement works correctly -->
performSegue(withIdentifier: "qrSegue", sender: self)
case .failure:
print("Error")
}
}
并且您可以在请求的待处理响应中显示页面中的加载,并在成功时隐藏它。