GCD
Grand Central Dispatch (GCD)是苹果比较提倡的一个多核编程的解决方法
GCD底层也是用线程来实现,指示苹果帮咱们封装了具体操作的方法,这样可以让程序员不用关注实现的细节,值需要关注功能的实现
GCD参数 queue:队列 block:任务
GCD 有两种执行任务的方式 1、同步dispatch_sync(避免在主队列中使用同步执行主线程任务 容易 死锁) 2、异步dispatch_async
同步和异步的区别:
同步:在当前线程中执行
异步:在另一天线程中执行
GCD执行多个任务的队列方式 也有两种:
1、串行队列:让任务一个接着一个地执行(一个任务执行完毕后,在执行下一个任务)
2、并发队列:可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能自由在异步函数(dispatch_async)下才有效
串行队列又分为两种:
1、主队列 dispatch_get_main_queue()主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中去执行
2、创建一个队列 dispatch_queue_create
串行队列:按照顺序去执行队列
1、主队列
dispatch_get_main_queue() 属于串行队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
NSLog(@"1111");
});
dispatch_async(mainQueue, ^{
NSLog(@"2222");
});
dispatch_async(mainQueue, ^{
NSLog(@"33333");
});
是一个队列 执行不同的任务
输出的顺序是1111,2222,33333
2、自己创建队列 串行队列
dispatch_queue_create("", NULL) 串行队列
dispatch_queue_t huLuWa = dispatch_queue_create("葫芦娃", NULL);
dispatch_sync(huLuWa, ^{
NSLog(@"1");
});
dispatch_sync(huLuWa, ^{
NSLog(@"2");
});
dispatch_sync(huLuWa, ^{
NSLog(@"3");
});
并发队列
并发队列 可以指定队列任务的优先级
使用 全局并发队列
//#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
//#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
//#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
//#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
// GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建
// long identifier 指定优先级的
dispatch_queue_t firstQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_queue_t twoQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t thirdQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(firstQueue, ^{
NSLog(@"1111");
});
dispatch_async(twoQueue, ^{
NSLog(@"2222");
});
dispatch_async(thirdQueue, ^{
NSLog(@"3333");
});
由于规定了优先级
并发队列代码执行的顺序是按照优先级执行的