转:iOS开发者常常用到的多线程都有啥?

转:http://www.elsyy.com/news/2014/1124/6812140770.html
iOS开发中的多线程,无疑是个很重要的知识点,要想把握多线程这块,就要学会如下这些。

1、进程
在移动端,一个app就是一个进程,在内存中占用必定的空间。
在计算机里,一个程序就是一个进程,一样也占用内存空间。
iOS同一时间点只有一个进程在使用CPU,只是系统把这个时间片分割地很是短,形成一种多个进程同时在执行的假象。

2、线程
一个进程的执行,必然从一个主线程开始。整个应用能够由单个主线程运行,可是涉及到一些耗时的任务,例如打开淘宝app,必然要加载一大堆的图片。
这时,若是只有单线程执行,程序必须等着图片都加载完毕才能继续往下执行,期间用户的交互就不起做用,这样用户体验很很差。
因此,这时就衍生出多线程的概念,能够开子线程给那些耗时的任务,在旁边默默地执行,而不影响应用的大局。
主线程,通常用来处理主体的展现(例如控制器的切换)和交互事件。
子线程,通常用来处理耗时的任务。固然,并非线程越多越好,多线程的使用也是要慎重考虑。

3、同步和异步
我以前一直对同步和异步这个概念理解不清,经常混淆。同步是线程安全呢,仍是异步线程安全呢?
今天终于记清楚了这个概念,只要记住一句话——同步,就是同类;异步,就是异类。已是同类,那确定是处于同一个线程;异类,那就说明不是一个线程。

4、并行和串行
并行:并发执行
串行:按顺序执行,一个接一个

5、三种经常使用建立多线程方式
1.NSThread:程序员手动管理线程,而多线程的状况下,线程何时执行完毕是未知的,若是管理很差,会形成内存泄露,因此这种方法不提倡。
2.NSOperation\NSOperationQueue。这两个类必须是搭配使用的,将操做放入操做队列中,依次执行。
使用步骤:建立NSOperation;添加NSOperation到NSOperationQueue
优势:更加面向对象;能够控制最大并发数 maxConcurrentOperationCount,使用这个属性能够保证同一时间内最大的并发数;添加任务(Operation)之间的依赖 addDependency,使用这个属性能够控制一个Operation必须在其依赖的Operation执行完毕后才调用。html

3.GCD(官方推荐使用,纯C语言)
调用同步(异步)执行的方法,传入要并行(串行)执行的队列参数,执行方法内的block代码。说白了就是同一时间有一个仍是多个线程执行,就看调用的方法和传入的队列类型。
队列类型:
全局队列:全部添加到全局队列中的任务都是并发执行(同时执行,可能会开启多个线程)
串行队列:全部添加到串行队列中的任务都是按顺序执行(开一条线程)
主队列:全部添加到主队列中的任务都是在主线程中执行的(跟方法名没有关系)
同步仍是异步,取决于方法名(不影响主队列,影响全局队列、串行队列)
同步:dispatch_sync,在当前线程执行任务,不会开启新的线程
异步:dispatch_async,在其余线程执行任务,会开启新的线程
代码demo演示:从组合学上说,老是共有四种状况:串行-同步、串行-异步、并行-同步、并行-异步。
串行-同步:显然一直只有一个线程在执行(这个就是真正意义上单线程)
串行-异步:可能会产生多个线程,可是同一时间只有一个线程在执行(异步虽然会产生多个不一样线程,可是同一时间只有一个线程在执行)
并行-同步:同一时间点有多个相同的线程在执行
并行-异步:同一时间有多个不一样的线程在执行(这是真正意义上的多线程)

下面就只举两个例子,剩下的2种状况触类旁通就是了程序员

而主队列的使用,经常用来执行完子线程后,要讲数据返回主线程来进行处理。好比开启子线程下载某个资源,下载完毕须要回调到主线程来展现。能够在子线程完成的时候调用如下的方法返回主线程,同时可以将子线程获得的参数传给处理的selector方法里执行。安全

四、开启后台线程多线程


更多关于移动互联网开发的知识,你们不妨到良师益友网来学习视频教程。并发

相关文章
相关标签/搜索