在iOS下使用多线程,我们通常会有两种选择,GCD或者NSOperation。这个大家都清楚,但是如何才能使用好多线程进行开发,往往在于开发者是否理解了多线程的原理和使用技巧。
今天,我给大家简单分享一些在iOS下开发时的多线程使用技巧,掌握了这些技巧,能够让大家快速的了解在iOS下的多线程开发方式。
基本概念
- 队列(负责调度任务)
- 串行队列:一个接一个的调度任务
- 并发队列:可以同时调度多个任务
- 主队列: 专门用来在主线程上调度任务的”队列”
- 全局队列:系统提供给程序员,方便程序员使用的队列,属于并发队列
- 执行方式:
- 同步执行:当前指令不完成,就不会执行下一条指令
- 异步执行:当前指令不完成,同样可以执行下一条指令(异步是多线程的代名词)
简单理解
1、开不开线程,取决于执行任务的函数,同步不开,异步开
2、开几条线程,取决于队列,串行开一条,并发开多条(异步)
注意点
- 主队列:(主队列不是主线程)
- 主队列不能在其他线程中调度任务!
- 如果主线程上当前正在有执行的任务,主队列暂时不会调度任务的执行!
- 异步任务,会在主线程的方法执行完成后,被调度
- 同步任务,会造成死锁
- 全局队列:
- 有关服务质量问题,使用以下代码能够做到 iOS7 & iOS8 的适配
dispatch_get_global_queue(0, 0);
- 有关服务质量问题,使用以下代码能够做到 iOS7 & iOS8 的适配
区别
- 全局队列 & 并发队列
- 名称,并发队列有名称,适合于商业级软件跟踪错误报告!
- release, 在 MRC 开发时,并发队列需要使用 dispatch_release(q);
- 结论:目前绝大多数的软件都会使用全局队列。比较优秀的第三方框架会使用自定义的并发队列!
- 建议:日常使用,用全局队列!
全局队列 & 串行队列选择建议
- 全局队列:并发,能够调度多个线程,执行效率高
-CPU消耗大,费电 - 串行队列:一个接一个,只能够开启一条线程,执行效率低
-如果任务之间需要依赖,使用串行队列
-省电,省钱,省流量
同步任务在多线程中的用处:
可以队列调度多个异步任务前,指定一个同步任务,让所有的异步任务,等待同步任务执行完成,这就是所谓的依赖关系!
GCD和NSOperation对比
1、GCD
GCD 在 iOS 4.0 推出的,主要针对多核处理器做了优化的并发技术,是 C 语言的
-将"任务"添加到"队列[串行/并发/主队列/全局队列]",并且指定执行任务的函数[同步/异步]
-线程间通讯 dispatch_get_main_queue()
-提供了一些 NSOperation 不具备的功能
- 一次性执行
- 延迟执行
- 调度组(在op中也可以做到,就是有点麻烦)
2、NSOperation
NSOperation 在 iOS 2.0 推出的,苹果推出 GCD 之后,对 NSOperation 底层重写了一遍
-将操作[异步执行的任务]添加到队列[并发队列],就会立即异步执行
-线程间通讯 mainQueue
-提供了一些 GCD 实现起来比较困难的功能!
- 最大并发操作数
- 队列的暂停/继续
- 取消所有操作
- 指定操作之间的依赖关系 (GCD 用同步实现)