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

iOS开发求助:Activity Indicator仅显示不旋转问题

Activity Indicator不旋转的问题解决

你的代码核心问题是**sleep(5)阻塞了主线程**。iOS的所有UI更新(包括Activity Indicator的动画渲染)都依赖主线程执行,当你调用sleep(5)时,主线程被强制挂起5秒,期间完全无法处理任何UI刷新任务:

  • startAnimating()触发的动画请求被卡住,无法执行帧更新
  • 5秒后主线程恢复,你立刻调用stopAnimating(),动画根本没机会启动

修复方案1:用GCD异步处理耗时操作

把耗时任务放到后台队列,UI操作留在主线程:

import UIKit

class ViewController: UIViewController { 
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
        
    @IBAction func startButton(_ sender: Any) {
        activityIndicator.startAnimating()
        print("starting")
        
        // 后台队列执行耗时操作
        DispatchQueue.global().async {
            // 这里替换成你的实际耗时任务(比如网络请求、数据处理)
            sleep(5)
            
            // 回到主线程更新UI
            DispatchQueue.main.async {
                print("stopping")
                self.activityIndicator.stopAnimating()
            }
        }
    }
}

修复方案2:用Async/Await(Swift 5.5+)

如果你的项目支持Swift 5.5及以上,用异步等待语法更简洁,且不会阻塞主线程:

import UIKit

class ViewController: UIViewController { 
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
        
    @IBAction func startButton(_ sender: Any) async {
        activityIndicator.startAnimating()
        print("starting")
        
        // 模拟耗时操作,Task.sleep不会阻塞主线程
        try? await Task.sleep(nanoseconds: 5 * 1_000_000_000)
        
        print("stopping")
        activityIndicator.stopAnimating()
    }
}

关键注意点

  • 所有UIKit相关操作(比如startAnimating()、stopAnimating())必须在主线程执行,UIKit不是线程安全的
  • 永远不要在主线程调用sleep()或执行任何长时间阻塞的任务,这会导致APP卡顿甚至无响应

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:32:14