IOS提供三种多线程方法,他们分别是:

  1. NSThread。
  2. Grand Central Dispatch,俗称GCD。
  3. NSOperation。

这三种方法抽象程度逐级提高,抽象度越高,越容易使用。目前使用GCD和NSOperation的情况占绝大多数,尤其以GCD更甚。

它们的优缺点分别为:


NSThread:

优点:轻量级,用户可以对线程的生命周期和行为做完全的控制。


缺点:用户需要控制的地方太多,比如管理线程生命周期,同步,加锁,调度等等,使得使用起来略有繁琐,容易出错。



GCD:


优点:


  1. Apple推荐的一种多核编程方法,对多核心处理器做了大量优化,能够最大限度发挥处理器性能。
  2. 对线程的一些细节,比如生命周期的管理,同步调度等等做了封装,使得用户无需考虑内部细节,可以将注意力放到具体的实现上。
  3. GCD是纯C语言的API,更接近底层,性能最高。
  4. 由于GCD大量使用Block实现,所以使得代码比较紧凑,不像NSOperation要提供很多回调函数。


缺点:


  1. 不是Cocoa框架的一部分,个人认为不太适用于架构设计,GCD是把利器,是将才而非帅才。
  2. 不能像NSOperation那样设置异步任务的执行依赖顺序。
  3. GCD只支持FIFO队列,不能像NSOperation那样可以调整队列内任务的执行顺序。


NSOperation:


优点:


  1. Cocoa框架的一部分,比较适用于架构设计。
  2. 同GCD一样对线程的一些细节,比如生命周期的管理,同步,调度等等做了封装,使得用户无需考虑内部细节,可以将注意力放到具体的实现上。
  3. 可以设置异步操作的依赖顺序。比如任务A(线程1)要在任务B(线程2)执行完之后才能执行。
  4. 可以调整队列内任务的执行顺序。
  5. 支持KVO,可以观察任务的执行状态。


缺点:


  1. 使用开销略比GCD大,由于当前的NSOperation的底层基本也是用GCD来实现,所以实际的开销有待商榷。
  2. 代码不如GCD紧凑,依赖回调函数。


总之,多线程是把双刃剑,合理的使用可以提高程序效率,滥用的话只会增加CPU的调度开销,从而影响性能。


后面几章,我们会用代码来对这三种方法做更加详细的说明。