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
相关产品推荐
相关产品推荐

