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)
归档时间: |
|
查看次数: |
25898 次 |
最近记录: |