不支持并发swift ios Xcode async/await的函数中的“async”调用

5fjcxozz  于 2022-11-17  发布在  Swift
关注(0)|答案(5)|浏览(189)

我尝试在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)")

有什么解决方案吗?

r7xajy2e

r7xajy2e1#

这里的答案是“await getSomethingLater”必须从异步上下文中调用。

let result = await tryThis.getSomethingLater(3.141592653589793238462)
print("result: \(result)")

变成这样:

Task {
    let result = await tryThis.getSomethingLater(3.141592653589793238462)
    print("result: \(result)")
}

所以整件事就变成了:

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()

Task {
    let result = await tryThis.getSomethingLater(3.141592653589793238462)
    print("result: \(result)")
}

输出如下:
结果:〉〉〉3.14〈〈〈
WWDC21的Meet async/await in Swift视频中有很多信息。

zfycwa2u

zfycwa2u2#

从非async代码调用async代码(包括actor字段)时,必须将其 Package 在Task

Task {
    let result = await tryThis.getSomethingLater(3.141592653589793238462)
    print("result: \(result)")
}

进一步阅读:并发-Swift编程语言(Swift 5.5)

vom3gejh

vom3gejh3#

最初的错误是因为Swift还不支持“顶层”await(即全局范围内的代码),这个错误只是意味着你需要为async函数提供一个异步上下文,比如使用TaskTask.detachedTaskGroup,这取决于你想要的行为。

Task.detached {
    let result = await tryThis.getSomethingLater(3.141592653589793238462)
    print("result: \(result)")
}

然而,当顶层await最终被提议、实现和支持时,你的代码片段应该在未来工作。顶层await支持被作为async/await SE-0296最初提议的一部分提到。

pzfprimi

pzfprimi4#

在我的例子中,我只是重构了:

async { some-code-which-can-take-some-time }

与:

Task { some-code-which-can-take-some-time }
vpfxa7rd

vpfxa7rd5#

当你试图从一个同步函数调用一个异步函数时,就会发生这个错误,这在Swift中是不允许的--异步函数必须能够挂起它们自己和它们的调用者,而同步函数只是不知道如何做到这一点。

func doAsyncWork() async {
    print("Doing async work")
}

func doRegularWork() {
    Task {
        await doAsyncWork()
    }
}

doRegularWork(执行定期工作)
Reference here

相关问题