我正在开发一个项目,并且正在向项目中的 API URL 发送 GET 请求。 (如下)
实际上这里的一切都适合我。但问题是;当我第一次发送请求时,“状态”值显示为 -proceeding-。过了一会儿就变成-完成了-。 (因为我正在等待 API 中的渲染)
我的问题是;我如何知道此状态值何时从进行中更改为已完成?因为我想在完成后做一个不同的动作。有什么想法吗?
func fetchURL(url: String) {
let apiUrl = URL(string: url)!
let session = URLSession.shared
let task = session.dataTask(with: apiUrl) { (data, response, error) in
if let error = error {
print("DEBUG: - Error: \(error)")
return
}
guard let data = data else {
print("DEBUG: - No data received")
return
}
do {
let decoder = JSONDecoder()
let dustResponse = try decoder.decode(FetchData.self, from: data)
print("DEBUG: - Status: \(dustResponse.detail.status)")
print("DEBUG: - Message: \(dustResponse.detail.message)")
} catch {
print("DEBUG: - Error decoding JSON: \(error)")
}
}
task.resume()
}
由于该过程是由 API 的服务器执行的,因此您无法真正知道它何时完成。我建议您看看是否有办法在处理完成时通知某种网络套接字。如果不这样做,您可以每 x 秒请求一次状态以查看处理是否完成:
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
func APIFetchResult(apiUrl: URL) async -> FetchData? {
return await withCheckedContinuation({ (result: CheckedContinuation<Continuation?, Never>) in
let session = URLSession.shared
let task = session.dataTask(with: apiUrl) { (data, response, error) in
if let error = error {
print("DEBUG: - Error: \(error)")
result.resume(returning: nil)
}
guard let data = data else {
print("DEBUG: - No data received")
result.resume(returning: nil)
}
do {
let decoder = JSONDecoder()
let dustResponse = try decoder.decode(FetchData.self, from: data)
print("DEBUG: - Status: \(dustResponse.detail.status)")
print("DEBUG: - Message: \(dustResponse.detail.message)")
result.resume(returning: dustResponse)
} catch {
print("DEBUG: - Error decoding JSON: \(error)")
result.resume(returning: nil)
}
}
task.resume()
})
}
let finalResult: FinalResultType? = nil
while finalResult == nil {
finalResult = await APIFetchResult(apiUrl: apiUrl)
await Task.sleep(5_000_000_000) // wait 5 seconds before re-doing the request
}
// do whatever you want after
在这段代码中我们:
fetchURL
函数创建 withCheckedContinuation
函数的等待/异步版本。finalResult
。希望这对您有帮助!