多线程开发技巧

目录
  1. 1. 引言
  2. 2. 简单理解

引言

在iOS下使用多线程,我们通常会有两种选择,GCD或者NSOperation。这个大家都清楚,但是如何才能使用好多线程进行开发,往往在于开发者是否理解了多线程的原理和使用技巧。
今天,我给大家简单分享一些在iOS下开发时的多线程使用技巧,掌握了这些技巧,能够让大家快速的了解在iOS下的多线程开发方式。

##基本概念

  1. 队列(负责调度任务)
  • 串行队列:一个接一个的调度任务
  • 并发队列:可以同时调度多个任务
  • 主队列: 专门用来在主线程上调度任务的”队列”
  • 全局队列:系统提供给程序员,方便程序员使用的队列,属于并发队列
  1. 执行方式:
  • 同步执行:当前指令不完成,就不会执行下一条指令
  • 异步执行:当前指令不完成,同样可以执行下一条指令(异步是多线程的代名词)

简单理解

1、开不开线程,取决于执行任务的函数,同步不开,异步开
2、开几条线程,取决于队列,串行开一条,并发开多条(异步)

##注意点

  1. 主队列:(主队列不是主线程)
  • 主队列不能在其他线程中调度任务!
  • 如果主线程上当前正在有执行的任务,主队列暂时不会调度任务的执行!
  • 异步任务,会在主线程的方法执行完成后,被调度
  • 同步任务,会造成死锁
  1. 全局队列:
  • 有关服务质量问题,使用以下代码能够做到 iOS7 & iOS8 的适配
    dispatch_get_global_queue(0, 0);

##区别

  1. 全局队列 & 并发队列
    • 名称,并发队列有名称,适合于商业级软件跟踪错误报告!
    • release, 在 MRC 开发时,并发队列需要使用 dispatch_release(q);
    • 结论:目前绝大多数的软件都会使用全局队列。比较优秀的第三方框架会使用自定义的并发队列!
    • 建议:日常使用,用全局队列!

###全局队列 & 串行队列选择建议

  1. 全局队列:并发,能够调度多个线程,执行效率高
    -CPU消耗大,费电
    
  2. 串行队列:一个接一个,只能够开启一条线程,执行效率低
    -如果任务之间需要依赖,使用串行队列
    -省电,省钱,省流量
    

###同步任务在多线程中的用处:
可以队列调度多个异步任务前,指定一个同步任务,让所有的异步任务,等待同步任务执行完成,这就是所谓的依赖关系!

##GCD和NSOperation对比
1、GCD

1
2
3
4
5
6
7
GCD 在 iOS 4.0 推出的,主要针对多核处理器做了优化的并发技术,是 C 语言的
-将"任务"添加到"队列[串行/并发/主队列/全局队列]",并且指定执行任务的函数[同步/异步]
-线程间通讯 dispatch_get_main_queue()
-提供了一些 NSOperation 不具备的功能
- 一次性执行
- 延迟执行
- 调度组(在op中也可以做到,就是有点麻烦)

2、NSOperation

1
2
3
4
5
6
7
8
NSOperation 在 iOS 2.0 推出的,苹果推出 GCD 之后,对 NSOperation 底层重写了一遍
-将操作[异步执行的任务]添加到队列[并发队列],就会立即异步执行
-线程间通讯 mainQueue
-提供了一些 GCD 实现起来比较困难的功能!
- 最大并发操作数
- 队列的暂停/继续
- 取消所有操作
- 指定操作之间的依赖关系 (GCD 用同步实现)


本作品采用 署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5)协议 进行许可,欢迎转载,但转载请注明来自SarielTang,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文永久链接:http://sarieltang.github.io/2015/09/05/总结分析/2015-09-05/index/