ios - 在导航到页面之前获取数据
问题描述
我正在尝试从 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 是空的,因为它在加载数据之前导航!如何使数据先加载,然后在上面的一切完成后导航?
解决方案
在您的方法中,数据获取是异步的。当您将要导航的代码放在 之后task.resume()
,这意味着在启动数据获取调用之后,执行的下一行是您的导航代码。
您需要做的是,您需要将导航代码放在响应块print(responseData)
内,在do-catch
块内之后。
注意:确保在主线程上执行导航代码。
推荐阅读
- jenkins - “上传到 SSC 时出错:网络错误:I/O 错误:连接重置”虽然从 Jenkins 的 Fortify Scan 构建成功
- sql - 使用累计和 sql 分区
- angular - Angular ngx无限滚动未检测到窗口滚动
- wpf - WPF 报表查看器属性
- c++ - 为什么这个 for 循环代码在不被接受的条件下工作?
- c++ - 声明太多变量后,主函数由于某种原因返回 -1
- json - 使用 jq 从同一个键中选择多个 JSON 值?
- node.js - Node Express 会话无法在实时服务器/生产环境中运行
- python - graphene-django:为什么 grahene-django 中的 ENUMS 返回值而不是键?
- php - PHP 致命错误:未捕获类型错误:count():参数 #1 ($value) 必须是 Countable|array 类型,给定 int