首页 > 解决方案 > 在导航到页面之前获取数据

问题描述

我正在尝试从 API 加载一些数据,然后导航到某个页面。问题是它在完成加载数据之前导航到页面。

我需要加载数据然后移动到页面

我正在做的是:

func getData(){
    var serviceCenter : ServiceCenter?
    var serviceCenterid : Int?

    print("AM HERE")
    let link: String = ""
    guard let Requesturl = URL(string: link) else {
        print("Error: cannot create URL")
        return
    }
    let urlRequest = URLRequest(url: Requesturl)

    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)

    let task = session.dataTask(with: urlRequest) {
        (data, response, error) in
        guard error == nil else {
            print("error calling GET on /public/api/services")
            print(error!)
            return
        }
        guard let responseData = data else {
            print("Error: did not receive data")
            return
        }
        print(responseData)
        guard let aViewController = UIStoryboard(storyboard: .mainStoryboard).instantiateViewController(withIdentifier: String(describing: aViewController.self)) as? aViewController else {
        return
    }
     aViewController.selectedServiceCenterID = serviceCenterID
    let navController = UINavigationController(rootViewController: aViewController)
    let controllerview = AppDelegate.topViewController()
    controllerview?.present(navController, animated: true, completion: nil)
        do {
            guard let receivedData = try JSONSerialization.jsonObject(with: responseData,options: []) as? [String: Any] else {
                print("Could not get JSON from responseData as dictionary")
                return
            }
            print(responseData)
            guard let data = receivedData["data"] as? [String: Any] else {
                print("Could not get status from JSON")
                return
            }


            guard let id = data["serviceCenterId"] as? Int else {
                print(error)
                return
            }
            serviceCenterid = id
            print(serviceCenterid)

        } catch  {
            print("error parsing response from POST on /public/api/login_customer")
            return
        }
    }
    task.resume()


}

我想在 ViewController 中打印的内容:-

override func viewDidLoad() {
    super.viewDidLoad()

    print("DEEPLINK")
    print(selectedServiceCenter)
    .....
 }

我得到的是:

> AM HERE
> 10041 bytes
> before
> nil
> 10041 bytes
> 26349 --> servicecenterid

我的问题是 selectedservicecenter 是空的,因为它在加载数据之前导航!如何使数据先加载,然后在上面的一切完成后导航?

标签: iosswift

解决方案


在您的方法中,数据获取是异步的。当您将要导航的代码放在 之后task.resume(),这意味着在启动数据获取调用之后,执行的下一行是您的导航代码。

您需要做的是,您需要将导航代码放在响应块print(responseData)内,在do-catch块内之后。

注意:确保在主线程上执行导航代码。


推荐阅读