Lazy loaded image
🚆OC中的GCD (Grand Central Dispatch)
Words 851Read Time 3 min
2025-2-25
2025-4-30
type
status
date
slug
summary
tags
category
icon
password

什么是GCD(Grand Central Dispatch)

GCD是Apple开发的一个多核编程的解决方案,它让开发者可以更加方便地进行多线程编程。GCD的核心是dispatch queue(调度队列)。

主要队列类型

1. 串行队列(Serial Dispatch Queue)

串行队列按照先进先出(FIFO)的顺序执行任务,同一时间只能执行一个任务。

2. 并发队列(Concurrent Dispatch Queue)

并发队列可以同时执行多个任务,但任务完成的顺序是不确定的。

3. 主队列(Main Queue)

主队列是一个特殊的串行队列,专门用于在主线程上执行任务,通常用于UI更新。

队列使用方式

1. 同步派发(Sync)

同步派发会阻塞当前线程,直到任务执行完成。

2. 异步派发(Async)

异步派发不会阻塞当前线程,任务会在后台执行。

常见使用场景

  • 网络请求:使用异步队列处理网络操作,完成后在主队列更新UI
  • 图片处理:在后台队列处理图片,避免阻塞主线程
  • 文件操作:使用后台队列进行文件读写操作

注意事项

  • 避免在主队列中执行耗时操作
  • 警惕死锁情况,例如在主队列中同步派发到主队列
  • 合理使用串行队列和并发队列,根据实际需求选择
  • 注意内存管理,防止循环引用
理解和正确使用GCD队列对于开发高性能的iOS应用至关重要。合理利用不同类型的队列和派发方式,可以显著提升应用的响应性和用户体验。
 

例子

这段代码中主要使用了以下几种dispatch方式:
  1. 使用全局并发队列进行异步操作: dispatch_async(dispatch_get_global_queue(0, 0), ^{ ... }) 用于处理热图模型数据,避免阻塞主线程
  1. 延迟派发到主队列: dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ ... }) 用于处理图片上传中的情况,延迟5秒后在主队列执行上报操作
这种使用方式符合GCD的最佳实践:
  • 将耗时操作放在后台队列处理
  • UI相关的操作(如更新状态)放在主队列执行
  • 合理使用异步操作来提高应用性能和响应性
上一篇
iOS UIKit概览
下一篇
通过Delegate&Protocol解决Pod循环应用实战