1

我正在尝试使用 Swift 5.5 中的 async / await 进行异步网络调用,但由于某种原因,它在我的 Swift 包中无法按预期工作。

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

上面的代码行在一个快速的操场上工作(这里的请求是一个 URLRequest)但它无法在我的 Swift 包中工作(使用 swift 工具版本 5.5)

起初的错误是:Type of expression is ambiguous without more context但我意识到它与元组分配有关,所以我将语句更改为:

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

它给了我错误:Value of type 'URLSession' has no member 'data'

此外,Xcode 的代码完成在 Swift 包中工作时不会列出 .data(for:) ,而不是在 Playground 中工作。检查下面的屏幕截图以获得更好的理解。

Swift Package Playground

4

2 回答 2

1

我已经做了足够的研究并得出结论,一个 Swift 包(它是通用构建的)需要 macOS 12.0 SDK for Swift Concurrency,而当前的 Xcode 13 版本没有它。它仅在测试版上,所以我必须使用最新的测试版或等到 Apple 宣布支持 macOS 12 SDK 的 Xcode 版本。

于 2021-10-18T06:25:30.287 回答
0

我很惊讶你没有看到错误

expression is 'async' but is not marked with 'await'

函数调用URLSession.shared.data(for: request),因为它是async,应该返回一个异步延续而不是一个(Data,URLResponse)元组。

您将有两种处理方式。您可以立即await按照评论中的建议进行回复:

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

或者您可以async let用来捕获延续,然后您可以稍后等待它:

async let requestTask = URLSession.shared.data(for: request)

print("Doing some other stuff")

let (data, response) = try await requestTask
于 2021-10-17T16:29:45.310 回答