iOS应用长Task执行时ProgressView无法实时更新的问题
解决ProgressView不实时更新的问题
你的代码里,ProgressView不实时更新的核心原因是:整个循环逻辑(包括等待操作)都在MainActor主线程任务中执行,导致SwiftUI无法及时响应进度变化的通知。
修改方案
把耗时的等待操作放到后台线程,仅在更新进度值时切换回主线程,这样UI就能实时刷新了。
修改后的ViewModel代码
class ViewModel: ObservableObject { @Published var progress = 0.0 func go() { // 后台执行循环和等待 Task { let c = 1...10 for n in c { try await Task.sleep(for: .seconds(1)) // 回到主线程更新进度,确保UI刷新 await MainActor.run { progress = Double(n) / 10.0 } } } } }
视图代码无需修改
struct ContentView: View { @EnvironmentObject var viewModel: ViewModel var body: some View { HStack { Button("Start") { viewModel.go() } ProgressView("Counting...", value: viewModel.progress, total: 1.0) } } }
改动说明
- 移除了Task的
@MainActor修饰,让循环和sleep操作默认在后台线程执行,避免占用主线程资源 - 使用
await MainActor.run包裹进度更新代码,确保progress的修改在主线程完成,SwiftUI能立即收到更新通知并刷新ProgressView
内容的提问来源于stack exchange,提问作者Ze Jibe
相关产品推荐
相关产品推荐

