前序:按顺序阅读更好
一 多线程的选择方案
| 技术方案 | 简介 | 语言 | 线程生命周期 | 使用频率 |
|---|---|---|---|---|
| pthread | 一套通用的多线程API,适用于Unix/Linux/Windows等系统,跨平台/可移植,使用难度大 | C | 程序员管理 | 几乎不用 |
| NSThread | 使用更加面向对象,简单易用,可直接操作线程对象 | OC | 程序员管理 | 偶尔使用 |
| GCD | 旨在替代NSThread等线程技术充分利用设备的多核 | C | 自动管理 | 经常使用 |
| NSOperation | 基于GCD(底层是GCD),比GCD多了一些更简单实用的功能,使用更加面向对象 | OC | 自动管理 | 经常使用 |
二 GCD和NSOperation的比较
-
GCD和NSOperation的关系如下:
- GCD是面向底层的C语言的API
- NSOperation是用GCD封装构建的,是GCD的高级抽象
-
GCD和NSOperation的对比如下:
- GCD执行效率更高,而且由于队列中执行的是由block构成的任务,这是一个轻量级的数据结构——写起来更加方便
- GCD只支持FIFO的队列,而NSOpration可以设置最大并发数、设置优先级、添加依赖关系等调整执行顺序
- NSOpration甚至可以跨队列设置依赖关系,但是GCD只能通过设置串行队列,或者在队列内添加barrier任务才能控制执行顺序,较为复杂
- NSOperation支持KVO(面向对象)可以检测operation是否正在执行、是否结束、是否取消
实际项目中,很多时候只会用到异步操作,不会有特别复杂的线程关系管理,所以苹果推崇的是优化完善、运行快速的GCD
如果考虑异步操作之间的事务性、顺序性、依赖关系,比如多线程并发下载,GCD需要写更多的代码来实现,而NSOperation已经内建了这些支持
不管是GCD还是NSOperation,系统对于线程的创建、调度管理和释放都做得很好,不需要我们操心;而NSThread需要我们自己去管理线程的生命周期,还要考虑线程同步、加锁问题,造成一些性能上的开销