在计算机的发展史上,促使其进步的原因无非就是两个点,其一是想让计算机做的更多,其二就是想让计算机运行的更快,当处理器同时能够做更多事情时,这两个点将都会得到改进; 引用自<深入理解计算机系统>
随着科技的发展,现在市面上的手机大多都已是多核处理器,也正是因为多核处理器和超线程的出现,使得应用程序运行的更快,当然它是有前提的,那就是要求程序以多线程的方式来书写,这也就是我们为什么需要在开发中采用多线程的原因,今天主要和大家分享一些iOS中最常用的多线程技术-GCD;
Grand Central Dispatch(GCD)是异步执行任务的技术之一,开发者只需要定义定义想执行的任务并追加到适当的Dispatch queue(执行处理的等待队列)中,GCD就能生成必要的线程并计划执行任务;
那知道了我们是要将想执行的任务添加到适当的队列中,那队列分为哪几种,就迫在眉睫了,在GCD中,存在两种队列:
一种是Serial Dispatch Queue, 是等待现在执行中任务处理的队列,在这里我将它理解为串行队列,添加在同一个 Serial Dispatch Quene 上的任务,会按照添加顺序依次执行,举个简单的例子:
dispatch_queue_t sericalQueue = dispatch_queue_create("com.apple.Ying", NULL);
dispatch_async(sericalQueue, 任务1);
dispatch_async(sericalQueue, 任务2);
dispatch_async(sericalQueue, 任务3);
dispatch_async(sericalQueue, 任务4;
dispatch_async(sericalQueue, 任务5);
如果将你要执行的任务添加在了一个Serial Dispatch Quene 类型的Queue上,执行顺序将是:任务1,2,3,4,5依次去执行完成任务,所以本人将之理解为串行队列,自始至终在同一个线程上执行着;
另一种是Concunrent Dispatch Queue,是不等待执行中任务的队列,在这里我将之理解为并行队列, 添加到Concunrent Dispatch Queue类型队列上的任务,不一定会按照顺序去执行完成,举个简单的例子:
dispatch_queue_t currentQueue = dispatch_queue_create("com.apple.Ying", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(currentQueue, 任务1);
dispatch_async(currentQueue, 任务2);
dispatch_async(currentQueue, 任务3);
dispatch_async(currentQueue, 任务4;
dispatch_async(currentQueue, 任务5);
如果你将任务添加到一个Concunrent Dispatch Queue类型的Queue上,从任务1开始执行后,可能并没有等到任务1完成,任务2就开始了,依次类推,不能保证任务是依次执行完成的,本人将之理解为并行队列;自始至终也不一定是在一个线程上执行的,至于会用到的多线程个数有几个,取决于当前队列的处理数,CPU核数及CPU负荷等系统因素;
知道了两种队列的区别,是不是想迫切的知道队列的创建呢,生成队列的方法也可以归纳为两种方式:
1.通过GCD的API生成Dispatch Queue
创建 Serial 对列
dispatch_queue_t sericalQueue = dispatch_queue_create("com.apple.Ying", NULL);
创建 Concurrent 队列
dispatch_queue_t currentQueue = dispatch_queue_create("com.apple.Ying", DISPATCH_QUEUE_CONCURRENT);
其中的第一个参数为队列名,一般都是以应用程序的包名倒序命名,有利于后续出现问题时的调试,第二个参数是区分队列的类型, 当为NULL时,是Serial 类型Queue,为DISPATCH_QUEUE_CONCURRENT时,寓意已经很明确了,就是一个Concurent Queue;
2.通过系统提供的标准的Dispatch Queue
1.Main Dispatch Queue, 看到Main,那肯定和主线程有什么瓜葛了,它是在主线程的RunLoop中执行的,因为主线程只有一个,并且在主线程上的任务一般都是按顺序执行的,那它肯定就是属于 Serial 类型的队列了;
2.在项目开发中相信大家都用过Global Dispatch Queue了,它就是典型的Concurrent 类的队列了,Global 队列最主要的知识点就是它的执行优先级,分别是高优先级,默认优先级,低优先级和后台优先级,创建一次为:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
});
关于GCD中队列的类型 和 如何创建适用于自己将要执行任务的任务的队列的说明,阐述到这里就结束了,关于GCD的更多知识,将在后续陆续阐述;
感谢你的耐心阅读,希望能给你的iOS学习带来一定的帮助,欢迎一起进步,一起交流,哪里有错误,更希望大牛的指正;
网友评论