[英]Function works in playground but not in XCode test
我有一个 function 从 URL 获取数据:
private func fetch(url: URL) -> String? {
var htmlString: String?
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard error == nil, let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
return
}
if let mimeType = httpResponse.mimeType, mimeType == "text/html",
let data = data,
let string = String(data: data, encoding: .utf8) {
htmlString = string
}
}
task.resume()
return htmlString
}
这个 function 在操场上工作,当我在 XCode 中将它作为 package 的一部分进行测试时,它似乎没有通过let task...
语句。 我该如何解决?
立即返回结果的dataTask
再现只有在您的设备恰好有缓存的响应准备好传递时才会起作用。 否则,它会在dataTask
有机会完成之前return
。
在返回结果之前需要等待服务器的响应。 在 Swift 并发中,我们将await
:
enum WebError: Error {
case notSuccess(Int)
case notHtml
}
private func fetch(url: URL) async throws -> String? {
let (data, response) = try await URLSession.shared.data(from: url)
guard let response = response as? HTTPURLResponse else {
throw URLError(.badServerResponse)
}
guard 200...299 ~= response.statusCode else {
throw WebError.notSuccess(response.statusCode)
}
guard
response.mimeType == "text/html",
let string = String(data: data, encoding: .utf8)
else {
throw WebError.notHtml
}
return string
}
请注意,我还会抛出错误,这样如果出现问题,调用者可以catch
错误并成功诊断出问题所在。
请参阅 WWDC 2021 视频将 async/await 与 URLSession 结合使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.