1.耗时操作

这是应用最广泛的场景,为了避免阻塞主线程,将耗时操作放在子线程处理,然后在主线程使用处理结果。

2.延时执行

延时一段时间后执行代码,一般见于打开 App 一段时间后,弹出求好评对话框。

3.定时器

由于 Timer 的 Target 是强引用,对于 Timer 的销毁需要特别处理,此外,Timer 的运行依赖于 Runloop,在 Runloop 的一次循环中,Timer 也只会执行一次,这使得在 Runloop 负担比较重时,可能会跳过 Timer 的执行,因此,在用到定时器的地方,你也可以用 CGD 的 TimerSource 替代

4.并发遍历

如果你需要更快的处理数据,可以用 concurrentPerform 让循环操作并发执行:

5.控制并发数

有时我们需要并发处理一些任务,但是并不想同时开很多线程,GCD 并没有类似 NSOperation 最大并发数的概念,但可以借助信号量实现

6.时序管理

时序管理主要有几种组合情况:

  • 子任务内不开线程依次执行
    • 参照耗时操作
  • 子任务内开线程依次执行
    • 一般见于网络请求,一个接口的请求参数是另一个接口的返回值,这种情况就需要对网络请求进行时序管理
  • 子任务内开线程不依次执行
    • 这种情况多见于需要请求多个接口,全部请求完毕后再进行某些操作,这可以借助 GCD 的任务组处理

7.自定义数据监听

当需要监听某个数据的变化,但不需要频繁的调用其对应的回调处理,可以使用 DispatchSourceUserData 进行监听,它会自动合并更改,并在队列空闲时进行回调,以节省 CPU 开销。

8.监听进程

在 Mac 开发中,你可以监听其他进程的开启关闭情况:

9.监听目录结构

GCD可以用来监听文件变化,例如目录变化,重命名等之类的

10.线程安全

你可以在资源读写时对其所在线程进行一些限制,而不必使用线程锁