1、首先来谈谈,为什么要使用多线程。
现在的智能手机,基本上都是双核、四核。所以,苹果公司为了迎合硬件,于是就采用多线程编程,更加充分的利用多核技术。
比如说,tableView的数据源就可以先放在子线程中处理,处理完毕后再到主线程中,通知tableView的页面布局。
2、要谈一谈多线程的几种方式
2.1、首先,谈的是NSThread
1、需要知道,NSThread是一种轻量级编程;
2、方式有两种:A、通过alloc出来的实例,需要手动开启线程(start方法)
B、通过类方法detachNewThread出来的,属于自动开启。
3、有一种可以替换NSThread是NSObject的后台操作方式,方法名是 performSelectorInBackground:
2.2、其次,要谈一谈GCD
1、需要知道的是,GCD是一种C语言,所有的函数名以dispatch打头,是打算替换掉NSThread的;
2、需要知道的是,GCD中其实是没有线程的概念的,GCD中只有任务和队列之分;
3、GCD中的任务---》就是定义你要干什么操作;
4、GCD中的队列---》就是你把你分配好的任务按着队列的方式进行管理,其中队列遵循的是FIFO;
5、GCD 中的同步/异步 --是否可以开启新线程的能力
dispatch_asyn 异步 ---》可以开启新的线程。
dispatch_syn 同步 ---》这个线程内部,不具备开启新线程的功能。
6、主队列 -- dispatch_main_queue()
全局队列 -- dispatch_get_global_queue()
7、关于安全性,只执行一次的操作,dispatch_once....应用到单例模式中创建一个单例。
2.3、最后, 需要谈一谈NSOperation&NSOperationQueue
1、首先,要意识到一点,NSOperation 相当于是任务的说法,NSOperationQueue 就是创建队列;
2、在创建任务的时候,会遇到NSOperation的两个子类:
2.1、NSInvocationOperation
2.2、NSBlockOperation
其中两个类都是创建一个任务,并且,两个类创建出来的实例,都是需要手动开启线程的,也就是start方法。
3、之后就要,谈到NSOperationQueue了,可以创建出一个队列,这个队列拿来干嘛的呢?
就是把你创建的一些任务,添加到这个队列上,并按照FIFO的方式进行管理。当然这里是不需要你手动开启的。
**但是,需要注意的一点就是,这个queue必须设置最大并发数,setMax....**
4、要意识到NSOperation&NSOperationQueue是面向对象的,其实就是
**对GCD的一种封装**,所以这就是我先谈GCD的原因。
5、需要注意,这里的**任务**之间是可以创建依赖关系的,
[A addDependency: B];也就是A必须要等到B运行结束后才开始,其中也有移除依赖关系的方法;
![这里写图片描述](https://img-blog.csdn.net/20151210232848258)
以上是我个人对多线程的理解,请多多指教。