【问题标题】:URLSession async not working in Swift PackageURLSession 异步在 Swift 包中不起作用
【发布时间】:2021-12-04 20:27:12
【问题描述】:

我正在尝试使用 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 的代码完成不会列出 .data(for:) 而在 Swift 包而不是在 Playground 中工作时。查看下面的屏幕截图以获得更好的理解。

Swift Package Playground

【问题讨论】:

  • 您忘记了 await 关键字,如果您还没有在异步上下文中调用,请不要忘记在异步上下文中执行该调用。 let (data, response) = await URLSession.shared.data
  • @AndyIbanez 我忘记在帖子中添加await 关键字,但是当我将它添加到代码中时它仍然不起作用。它会产生相同的错误。

标签: swift async-await urlsession swift-package


【解决方案1】:

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

【讨论】:

  • 更新:它在 Xcode 13.1 RC 1 上按预期工作。问题是缺少 SDK。
【解决方案2】:

我很惊讶你没有看到错误

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

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

您将有两种处理方式。您可以立即await cmets 中建议的回复:

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

【讨论】:

  • 对此我很抱歉,我忘记在帖子中输入await 关键字,但即使使用await 关键字我也会遇到同样的错误。 async let 也不起作用。错误在于,Swift 无法识别 URLSession 的 data(for:) 方法。在 Playground 中正常工作,但不适用于我的 Swift 包。
  • 那么我担心你将不得不在你的包中发布更多关于 Swift 配置的信息。您的构建设置是否设置为使用正确的 Swift 版本?支持的最低 iOS 版本是否设置为 15(或使用的版本标志)等。看来您的问题与代码无关,而与该代码的编译方式有关。
  • 它在 iOS 应用程序或 Playground 中按预期工作。它甚至建议我在我的 iOS 应用项目中添加 @available 属性。它无法识别我的 Swift 包中的所有内容。我很确定我使用的是 swift-tools-version 5.5,我什至尝试创建一个新的 Swift 包(使用最新的 Swift),但它似乎在一般的 Swift 包中不起作用!
猜你喜欢
  • 1970-01-01
  • 2019-04-11
  • 2017-09-06
  • 2017-03-21
  • 2018-07-13
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多