我尝试在Swift 5.5中使用async/await。我有自己的async函数,但每当我尝试调用它时,都会收到以下错误:
不支援并行的函式中的'async'呼叫
下面是代码示例:
class TryThis {
func getSomethingLater(_ number: Double) async -> String {
// test - sleep for 3 seconds, then return
Thread.sleep(forTimeInterval: 3)
return String(format: ">>>%8.2f<<<", number)
}
}
let tryThis = TryThis()
let result = await tryThis.getSomethingLater(3.141592653589793238462)
print("result: \(result)")
有什么解决方案吗?
5条答案
按热度按时间r7xajy2e1#
这里的答案是“await getSomethingLater”必须从异步上下文中调用。
变成这样:
所以整件事就变成了:
输出如下:
结果:〉〉〉3.14〈〈〈
WWDC21的Meet async/await in Swift视频中有很多信息。
zfycwa2u2#
从非
async
代码调用async
代码(包括actor
字段)时,必须将其 Package 在Task
:进一步阅读:并发-Swift编程语言(Swift 5.5)
vom3gejh3#
最初的错误是因为Swift还不支持“顶层”await(即全局范围内的代码),这个错误只是意味着你需要为async函数提供一个异步上下文,比如使用
Task
、Task.detached
或TaskGroup
,这取决于你想要的行为。然而,当顶层await最终被提议、实现和支持时,你的代码片段应该在未来工作。顶层await支持被作为async/await SE-0296最初提议的一部分提到。
pzfprimi4#
在我的例子中,我只是重构了:
与:
vpfxa7rd5#
当你试图从一个同步函数调用一个异步函数时,就会发生这个错误,这在Swift中是不允许的--异步函数必须能够挂起它们自己和它们的调用者,而同步函数只是不知道如何做到这一点。
doRegularWork(执行定期工作)
Reference here