GCD——Grand Central Dispatch 是基于C语言的框架,可以充分利用多核,也是苹果官方推荐使用的多线程技术。
GCD是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread,NSOperation的高效和强大的技术,GCD是基于C语言的
GCD是苹果公司为多核的并行运算提出的解决方案
GCD会自动利用更多的CPU内核(比如双核、四核)
GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
多线程里面概念性的东西很多也很难记,所以一定要好好理解。还是通过代码,在温习温习吧。相同的代码写多次,虽然有时很枯燥,可每次都会有不同的体会和领悟。走起!
viewController中:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
/*
//写之前,再来温习温习。
GCD的使用:
一 :队列
1.串行队列:添加到队列中的任务是一个一个执行的
2.并发(行)队列:添加到队列中的任务是多个同时执行的
3.主队列:里面的任务都是在主线程执行的。
4.全局队列:并行(发)队列
二:同步、异步
1、同步:需要后面的任务等待,不会开启新的线程,会直接使用当前的线程
2、异步:不需要后面的任务等待,会开启新的线程
*/
- (void)viewDidLoad {
[super viewDidLoad];
/*---------创建并发队列---------*/
//1.创建并行队列
dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);
//2.获取全局队列(并行队列)
/*优先级<#long identifier#>
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
*/
dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//(1)在并发队列添加异步任务
dispatch_async(queue2, ^{
for (int i = 0; i < 50 ;i ++) {
NSLog(@"1---------1");
}
});
dispatch_async(queue2, ^{
for (int i = 0; i < 50 ;i ++) {
NSLog(@"2---------2");
}
});
打印结果:
通过打印结果我们可以看出:
(1)并发队列异步添加任务会开多条线程,执行顺序是没有先后(同时执行)
看完并发队列的异步添加,让我们再来看看并发队列的同步添加:
dispatch_sync(queue2, ^{
@autoreleasepool {
for (int i = 0; i < 50 ;i ++) {
NSLog(@"1---------1");
}
}
});
dispatch_sync(queue2, ^{
@autoreleasepool {
for (int i = 0; i < 50 ;i ++) {
NSLog(@"2---------2");
}
}
});
这个打印结果相信不用说,我们都知道肯定是先执行1 在执行2
其实执行问题好回答,关键是此时的任务是在那个线程完成的,相信如果你对同步添加的概念如果十分清楚的话一定能回答对,没有错。这些任务是在主线程中完成的。并不是在queue2中完成的。让我们看图吧,有图有真相
通过以上分析我们可以看出:
(1)在并发队列中同步添加任务,不会开启新的线程,会直接使用当前线程,
(2)并且,我们添加的任务是添加到主线程。并不是表面现象的queue2。
看完并发(行)队列,让我们来看看串行队列吧。
<pre name="code" class="objc">/*---------创建串行----------*/ dispatch_queue_t queue = dispatch_queue_create("queue3", DISPATCH_QUEUE_SERIAL); //向串行队列异步添加任务 dispatch_async(queue, ^{ for (int i=0; i<50; i++) { NSLog(@"