我正在尝试从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为空,因为它在加载数据之前就已导航!上面的所有步骤完成后,如何使数据首先加载然后导航?
答案 0 :(得分:3)
在您的方法中,数据获取是异步的。当您将代码放置在task.resume()
之后进行导航时,这意味着在启动数据提取调用之后,下一条要执行的行就是您的导航代码。
您需要做的是,将print(responseData)
放在do-catch
块中之后,需要将导航代码放入响应块中。
注意:确保在主线程上执行导航代码。
答案 1 :(得分:0)
使用回调处理程序编写函数,并在回调中导航至所需的viewController,这将解决您的问题。