尽管现代并发向后兼容,为什么我会看到有关“data(for:delegate:) is only available on iOS 15.0+”的错误

Sab*_*thi 9 concurrency xcode ios swift urlsession

现代并发性Async / Await是通过 Swift 5.5 为 iOS 15 及更高版本引入的,但很快,随着 Xcode 13.2(以及随后的 13.2.1)的发布,它使我们能够使用AsyncAwait开发 iOS 13+、macOS 10.15+ 等。但是,当我尝试发出这样的异步请求时:

let (data, response) = try await URLSession.shared.data(for: request)

它不能在 iOS 13+ 上运行。相反,我收到一条错误消息:

data(for:delegate:)仅适用于 iOS 15.0 或更高版本

当我将最低部署目标设置为 iOS 15.0 时,该错误消失,但我希望该软件支持 iOS 13.0+。据我所知,data(for:delegate:)仅在 iOS 15.0+ 上受支持,但如果我无法发出异步网络获取请求,向后兼容 13.0+ 有何意义?

Gus*_*nde 16

正如Sundell 的这篇 Swift 文章中所述:

\n
\n

尽管 Swift 5.5\xe2\x80\x99s 新的并发系统在 Xcode 13.2 中变得向后兼容,但使用这些新并发功能的一些内置系统 API 仍然仅在 iOS 15、macOS Monterey 等上可用Apple\xe2\x80\x99s 2021 操作系统。

\n
\n

这是 John 为一种方法复制异步/等待驱动的 URLSession API 的方式:

\n
@available(iOS, deprecated: 15.0, message: "Use the built-in API instead")\nextension URLSession {\n    func data(from url: URL) async throws -> (Data, URLResponse) {\n         try await withCheckedThrowingContinuation { continuation in\n            let task = self.dataTask(with: url) { data, response, error in\n                 guard let data = data, let response = response else {\n                     let error = error ?? URLError(.badServerResponse)\n                     return continuation.resume(throwing: error)\n                 }\n\n                 continuation.resume(returning: (data, response))\n             }\n\n             task.resume()\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n