已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。
2天前关闭。
Improve this question
我的代码执行API请求并加载数据。在下一步中,数据将显示为Map上的标记。但现在它的顺序是错误的。我的控制台首先显示"Second line of code executed"
,然后显示"The Data has been loaded"
。结果是POI不会显示在我的Map上。
下面是我下载和解析数据的方式:
struct hereApi {
static var dataFromHereApi = [Items]()
static var gewählteKategorie = 0
func fetchPoi(geoCordinate: String) {
var selectedCategory = "0"
selectedCategory = {
switch hereApi.gewählteKategorie {
case 0:
return
"gym"
case 1:
return "school"
default:
return "cinema"
}
}()
let urlString = "https://..."
performRequest(urlString: urlString)
}
func performRequest(urlString: String) {
if let url = URL(string: urlString) {
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { data, response, error in
if error != nil {
print(error!)
return
}
if let safeData = data {
parseJSON(poiData: safeData)
}
}
task.resume()
}
}
func parseJSON(poiData: Data) {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode(POIData.self, from: poiData)
hereApi.dataFromHereApi = decodedData.items
print("The Data has been loaded.")
} catch {
print(error)
}
}
}
这是我在另一个ViewController中执行请求的方式:
var networkGoogleApiConnect = hereApi()
func loadDataFromApi(arg: Bool, completion: (Bool) -> ()) {
...
networkGoogleApiConnect.fetchPoi(geoCordinate: fullCordinate)
completion(arg)
}
loadDataFromApi(arg: true, completion: { (success) -> Void in
print("Second line of code executed")
if success {
print("true")
} else {
print("false")
}
})
1条答案
按热度按时间tvokkenx1#
关于网络代码的事情是,因为你没有采用
async/await
,你的其他代码在网络发生时不会暂停。因此,在网络有机会开始之前,你所有的代码就已经完成了。这导致了“无序”的抱怨--因为在网络和异步代码中,事情确实是无序发生的。因此,如果您要使用完成处理程序,则需要此事件链中的 every 方法都有一个完成处理程序。所以:
session.dataTask
有一个完成处理程序,您已经实现了它。到目前为止,一切顺利。performRequest
必须有一个完成处理程序,当我们从网络请求中返回时,它会在session.dataTask
的完成处理程序中调用它。fetchPoi
必须有一个完成处理程序,它在来自performRequest
的完成处理程序中调用它。loadDataFromApi
从fetchPoi
调用完成处理程序中的完成处理程序。(If如果你不明白为什么,请阅读从http://www.programmingios.net/what-asynchronous-means/.开始的三篇文章)
但一个更简单的解决方案是在整个系统中采用
async/await
。