在同步非隔离上下文中调用主参与者隔离实例方法 XXX

JGu*_*Guo 31 async-await swift swift-concurrency

我正在尝试向 UIButton 添加异步 do/catch/defer 操作。但是,如果我只是调用 defer 块中的方法,则会收到Call to main actor-isolated instance method XXX in a synchronous nonisolated context错误。我发现的解决方法是将其包装在另一个Task块中,如下所示。只是想检查这是否是正确的方法?如果有人能解释该错误消息的实际含义,那就太好了。

@objc private func post(_ sender: UIButton) {
    Task {
        // defer { dismiss(animated: true) } -- Doesn't work
        defer { Task { await dismiss(animated: true) } }
        do {
            try await doSomethingAsync()
        } catch {
            print(error)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sou*_*unt 19

这是当前 swift 版本中的错误,因为编译器无法识别块的全局 actor 上下文defer对此的讨论正在 swift 论坛上进行,并且还提供了一个带有修复程序的PR,应该可以在未来的 swift 版本中解决此问题。目前,需要显式地提供全局 actor 上下文以供编译代码:

defer { Task { @MainActor in dismiss(animated: true) } }
Run Code Online (Sandbox Code Playgroud)