一、GCD简介
- GCD(Grand Central Dispatch)是iOS4引入的强大的线程处理技术,它是基于XNU内核开发的,所以性能极为优越。
- 终端输入man dispatch可打开GCD的框架。
二、GCD与多线程
(一)串行队列和并行队列(serial and concurrent)
1.概念
- 并行队列:同时无序执行
- 串行队列:遵循FIFO原则,依次执行
2.队列的获取
//@param "com. 工程名 .queue1" 队列的标志,一般以倒置的域名+队列的名字命名
//@param 队列的类型的标志
dispatch_queue_t serialQueue = dispatch_queue_create("com.myProject.queue1", DISPATCH_QUEUE_SERIAL);
- 获取并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.myProject.queue2", DISPATCH_QUEUE_CONCURRENT);
- 获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
主队列是串行的队列。
- 获取全局队列
//@param 队列的优先级 DISPATCH_QUEUE_PRIORITY_BACKGROUND //@param 预留接口 dispatch_queue_t globleQueue = dispatch_get_global_queue(0, 0);
全局队列是并行的队列。
(二)异步执行和同步执行(asynchronous and synchronization)
1.概念
- 同步执行:阻塞当前线程,但不会开辟新的线程
- 异步执行:不会阻塞当前线程,可能会开辟新的线程
2.执行方式
- 同步执行
dispatch_sync(globleQueue, ^{
});
- 异步执行
dispatch_async(globleQueue, ^{
});
(三)GCD开辟线程
(四)GCD线程组
-
代码
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, globleQueue, ^{
sleep(1);
NSLog(@"下载图片1");
});
dispatch_group_async(group, globleQueue, ^{
sleep(1);
NSLog(@"下载图片2");
});
dispatch_group_async(group, globleQueue, ^{
sleep(1);
NSLog(@"下载图片3");
});
dispatch_group_notify(group, globleQueue, ^{
NSLog(@"所有图片下载完成");
});
加入线程组的目的是为了集中管理各个线程,这里传入的是全局队列,由于它是并行队列,所以执行是并发无序的。
(五)线程等待