You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

改动说明

  1. 移除了Task的@MainActor修饰,让循环和sleep操作默认在后台线程执行,避免占用主线程资源
  2. 使用await MainActor.run包裹进度更新代码,确保progress的修改在主线程完成,SwiftUI能立即收到更新通知并刷新ProgressView

内容的提问来源于stack exchange,提问作者Ze Jibe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:13:25