导航到页面之前获取数据

时间:2019-09-11 18:37:27

标签: ios swift

我正在尝试从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为空,因为它在加载数据之前就已导航!上面的所有步骤完成后,如何使数据首先加载然后导航?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

使用回调处理程序编写函数,并在回调中导航至所需的viewController,这将解决您的问题。