POST请求到服务器后,用户对象包含nil

问题描述 投票:-2回答:1

在使用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
        }
    }

}
swift xcode alamofire
1个回答
1
投票

您的服务电话是异步的。阅读有关同步和异步方法的信息。

Medium

Ray Wenderlich

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

并且您可以在请求的待处理响应中显示页面中的加载,并在成功时隐藏它。

© www.soinside.com 2019 - 2024. All rights reserved.