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

Swift开发中点击按钮启动不确定进度条避免应用无响应的实现方法

macOS Swift 不确定进度条实现方案

核心逻辑

避免应用无响应的核心是耗时操作放后台线程执行,UI更新全在主线程处理,你已声明的NSProgressIndicator IBOutlet可以直接按以下步骤配置使用:

步骤1:初始化进度条属性

在viewDidLoad中添加如下配置:

override func viewDidLoad() {
    super.viewDidLoad()
    // 设置为不确定进度模式
    progressBar.isIndeterminate = true
    // 可选样式:.spinning 圆形旋转进度条 / .bar 条形流动进度条
    progressBar.style = .bar
    // 默认隐藏进度条
    progressBar.isHidden = true
}

步骤2:绑定耗时操作的进度条显隐逻辑

触发耗时操作时按以下结构写代码即可:

func runTargetOperation() {
    // 主线程启动进度条动画
    DispatchQueue.main.async { [weak self] in
        guard let self = self else { return }
        self.progressBar.isHidden = false
        self.progressBar.startAnimation(nil)
    }
    
    // 后台线程执行耗时操作,不阻塞主线程
    DispatchQueue.global(qos: .userInitiated).async { [weak self] in
        guard let self = self else { return }
        
        // 此处替换为你的实际业务逻辑:比如数据计算、文件读写、网络请求等
        // 示例:模拟3秒耗时操作
        Thread.sleep(forTimeInterval: 3)
        
        // 操作完成后回到主线程关闭进度条
        DispatchQueue.main.async {
            self.progressBar.stopAnimation(nil)
            self.progressBar.isHidden = true
            // 后续业务逻辑(比如刷新页面、弹出结果提示等)写在这里
        }
    }
}

注意事项

  • 所有操作progressBar的代码必须放在DispatchQueue.main.async块中,否则会出现UI更新延迟、错乱甚至崩溃问题
  • 不确定进度模式下不需要手动修改progressBar的doubleValue属性,系统会自动循环播放动画
  • 任何耗时超过100ms的逻辑都不要放到主线程执行,这是避免系统弹出无响应提示的根本要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:45:03