Swift如果把异步代码写入MainActor.run {} 同步闭包,就会报错:
Cannot pass function of type '@Sendable () async -> ()' to parameter expecting synchronous function type
例如:
Task {
let success = FileUtils.cleanTempFolder()
// MainActor是同步函数
await MainActor.run {
if success {
cleanStatus = .success
} else {
cleanStatus = .error
// 同步函数调用异步函数
try? await Task.sleep(for: .seconds(1))
cleanStatus = .clean
}
}
}
解决方案:将异步函数移除MainActor.run同步闭包。
Button(action: {
if cleanStatus == .clean {
cleanStatus = .loading
Task {
let success = FileUtils.cleanTempFolder()
// 1. 更新 UI(主线程)
await MainActor.run {
cleanStatus = success ? .success : .error
}
// 2. 如失败,延迟恢复状态(后台等待 + 主线程更新)
if !success {
try? await Task.sleep(nanoseconds: 1_000_000_000)
await MainActor.run {
cleanStatus = .clean
}
}
}
}
})
