繁体   English   中英

Function 在 playground 工作但不在 XCode 测试

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM