Пользовательский объект содержит ноль после запроса POST к серверу - PullRequest
0 голосов
/ 26 марта 2019

После отправки запроса POST с помощью alamofire для регистрации пользователя в моем приложении я пытаюсь создать объект User из возвращенного user_id с моего сервера.Однако, когда я пытаюсь напечатать некоторые атрибуты этого пользовательского объекта сразу после его инициализации, он работает нормально.Однако, когда я пытаюсь распечатать некоторые его атрибуты после того, как завершится выполнение почтового запроса alamofire, я получаю ноль.

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

}

1 Ответ

1 голос
/ 26 марта 2019

Ваш сервисный звонок асинхронный. Читайте о синхронизации против асинхронных методов.

Средний

Рэй Вендерлих

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

И вы можете показывать загрузку на своей странице, ожидая ответа на запрос, и скрывать ее в случае успеха.

...