我仍然在尝试理解和控制异步任务。我有一个应用程序,这是生成多个API调用不同的供应商。我最多可以并行执行367个API调用。我如何协调所有这些,以便我可以知道第一个开始和最后一个完成的时间?
有了这个论坛的帮助,我可以让它在单个呼叫下工作,而不是多个呼叫。
下面是我在一个类中对API的调用(相关小节介绍了.completion的用法:
let session = URLSession.shared
let url = components.url!
let request = URLRequest(url: url)
session.dataTask(with: request) { data, response, error in
if let error = error {
DispatchQueue.main.async {
completion(.failure(error))
}
return
}
guard
let responseData = data,
let httpResponse = response as? HTTPURLResponse,
200 ..< 300 ~= httpResponse.statusCode
else {
DispatchQueue.main.async {
completion(.failure(AstronomicalTimesError.invalidResponse(data, response)))
}
return
}
do {
print("Astronomical times api completed with status code ", httpResponse.statusCode)
let astronomicalTimesResponse = try JSONDecoder().decode(AstronomicalTimesResponse.self, from: responseData)
DispatchQueue.main.async {
completion(.success(astronomicalTimesResponse))
//print("astronomical times loaded ", astronomicalTimesResponse)
}
} catch let jsonError {
DispatchQueue.main.async {
completion(.failure(jsonError))
}
}
}.resume()然后针对日期范围内的每一天调用此方法。
repeat {
let astronomicalTimes = AstronomicalTimes(date: astRetrievalDate, latitude: station.lat, longitude: station.long)
astronomicalTimes.start { result in
switch result {
case .success(let astronomicalTimesResponse):
let detail = DayDetails(date: astRetrievalDate, astronomicalTimes: astronomicalTimesResponse.results)
details.append(detail)
case .failure(let error):
print("Astronomical Times API call from saved tides failed with error \(error)")
}
}
astRetrievalDate = astRetrievalDate.dayAfter
} while astRetrievalDate.noon <= toDate.noon
let tideToSave = SavedTides(saveKey: key, details: details)
savedTides.append(tideToSave)
print("saved tide details: ", savedTides)我想在savedTides中构建结果,但是,在赋值给savedTides之后,所有的API都完成了,所以这总是空的。请注意,我还将向不同的提供程序触发另外两个单独的API,因此在将所有这些API的结果分配给一个数组之前,我需要完成所有这些API。
发布于 2020-03-11 17:30:04
你为什么不看看promises呢?因此,您可以在完成之前需要完成的其他调用时触发其他调用。
https://github.com/mxcl/PromiseKit
您可以将多个promises组合到一个数组中,并将它们放在一起,或者DispatchGroup可以帮助您。
发布于 2020-03-13 17:47:57
谢谢大家。DispatchGroup就是答案。我真的很难从苹果的文档中理解如何使用它,然而我偶然发现了这篇优秀的教程,一切都很清楚。How to use DispatchGroup in Swift 4.2
https://stackoverflow.com/questions/60631564
复制相似问题