iOS开发:GCD
2018-02-20 16:38
344 查看
在iOS开发中经常会用到GCD,如果你在求职过程中GCD的使用也是面试官必问的,那么今天就来说说GCD的有关内容,不喜勿喷。
一、GCD的概念
1.GCD全称是Grand Central Dispatch,可译为“CPU的中枢调度器”,是C语言,提供了非常多的强大的函数。
2.GCD的优势:GCD是苹果公司为多核的并行运算提出的解决方案,它会自动利用更多的CPU内核(比如四核),而且它会自动管理线程的生命周期(创建线程、调度任务、销毁线程),开发者只需告诉GCD想要执行什么任务,不需编写任何线程管理代码。
二、GCD的核心
GCD的两个核心内容:任务和队列。
1.任务:执行什么样的操作;
2.队列:拿来存放任务。
三、GCD的使用
GCD的使用只需两步即可:制定任务、将任务添加到队列中。
1.制定任务:确定想要做的事情;
2.将任务添加到队列中:GCD会自动将队列中的任务取出来,放到对应的线程中执行。另外,任务的取出遵循队列的FIFO原则:先进先出,后进后出。
(二)执行任务
GCD中有两个用来执行任务的函数:同步和异步
1.同步执行任务的方法:
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
queue:队列 block:任务
2.异步执行任务的方法:
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
3.同步和异步的区别 同步:只能在当前线程中执行任务,不具备开启新线程的能力;
异步:可以在新的线程中执行任务,具备开启新线程的能力。
(三)队列的类型
GCD的队列分为两个类型:串行和并发
并发队列(Concurrent Dispatch Queue):可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)注意: 并发功能只有在异步(dispatch_async)函数下才有效执行。
串行队列(Serial Dispatch Queue):让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)。
四、GCD相关内容
1.GCD中有4个术语比较容易混淆:同步、异步、并发、串行
2.同步和异步二者的主要影响:能否开启新的线程;
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
3.并发和串行二者的主要影响:任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
注意:同步函数+主队列 == 死锁(会卡死)
(值得注意的是,同步任务有一个特性是,只要一添加到队列中就要立马执行,主队列中永远就只有一条线程——主线程,此时主线程在等待着主队列调度同步任务,而主队列发现主线程上还有任务未执行完,就不会让同步任务添加到主线程上,由此就造成了互相等待(主队列在等待主线程执行完已有的任务,而主线程又在等待主队列调度同步任务,此时就造成所谓的死锁了。)
示例代码如下:
//主队列(会卡死)
- (void)syncMainQueue {
//1.主队列(添加到主队列中的任务,都会自动放到主线程中去执行)
dispatch_queue_t queue = dispatch_get_main_queue();
//2.添加任务,到主队列中,异步执行
dispatch_sync(queue, ^{
NSLog(@"下载视频1---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"下载视频2---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"下载视频3---%@", [NSThread currentThread]);
});
}
4.各种队列的执行效果,如下图所示:
以上就是这篇GCD博文的全部内容,欢迎关注三掌柜微信公众号,更多精彩等您来,欢迎关注!
一、GCD的概念
1.GCD全称是Grand Central Dispatch,可译为“CPU的中枢调度器”,是C语言,提供了非常多的强大的函数。
2.GCD的优势:GCD是苹果公司为多核的并行运算提出的解决方案,它会自动利用更多的CPU内核(比如四核),而且它会自动管理线程的生命周期(创建线程、调度任务、销毁线程),开发者只需告诉GCD想要执行什么任务,不需编写任何线程管理代码。
二、GCD的核心
GCD的两个核心内容:任务和队列。
1.任务:执行什么样的操作;
2.队列:拿来存放任务。
三、GCD的使用
GCD的使用只需两步即可:制定任务、将任务添加到队列中。
1.制定任务:确定想要做的事情;
2.将任务添加到队列中:GCD会自动将队列中的任务取出来,放到对应的线程中执行。另外,任务的取出遵循队列的FIFO原则:先进先出,后进后出。
(二)执行任务
GCD中有两个用来执行任务的函数:同步和异步
1.同步执行任务的方法:
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
queue:队列 block:任务
2.异步执行任务的方法:
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
3.同步和异步的区别 同步:只能在当前线程中执行任务,不具备开启新线程的能力;
异步:可以在新的线程中执行任务,具备开启新线程的能力。
(三)队列的类型
GCD的队列分为两个类型:串行和并发
并发队列(Concurrent Dispatch Queue):可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)注意: 并发功能只有在异步(dispatch_async)函数下才有效执行。
串行队列(Serial Dispatch Queue):让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)。
四、GCD相关内容
1.GCD中有4个术语比较容易混淆:同步、异步、并发、串行
2.同步和异步二者的主要影响:能否开启新的线程;
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
3.并发和串行二者的主要影响:任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
注意:同步函数+主队列 == 死锁(会卡死)
(值得注意的是,同步任务有一个特性是,只要一添加到队列中就要立马执行,主队列中永远就只有一条线程——主线程,此时主线程在等待着主队列调度同步任务,而主队列发现主线程上还有任务未执行完,就不会让同步任务添加到主线程上,由此就造成了互相等待(主队列在等待主线程执行完已有的任务,而主线程又在等待主队列调度同步任务,此时就造成所谓的死锁了。)
示例代码如下:
//主队列(会卡死)
- (void)syncMainQueue {
//1.主队列(添加到主队列中的任务,都会自动放到主线程中去执行)
dispatch_queue_t queue = dispatch_get_main_queue();
//2.添加任务,到主队列中,异步执行
dispatch_sync(queue, ^{
NSLog(@"下载视频1---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"下载视频2---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"下载视频3---%@", [NSThread currentThread]);
});
}
4.各种队列的执行效果,如下图所示:
以上就是这篇GCD博文的全部内容,欢迎关注三掌柜微信公众号,更多精彩等您来,欢迎关注!
相关文章推荐
- iOS多线程开发之GCD(中级篇)
- iOS开发多线程篇—GCD的基本使用
- iOS开发多线程篇—GCD的常见用法
- [iOS开发]使用GCD遇到的问题
- iOS开发 - 多线程之GCD
- iOS开发中GCD在多线程方面的理解
- iOS开发中的多线程的GCD用法
- [置顶]iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)
- 转载:iOS开发之GCD使用总结
- IOS开发(61)之GCD执行非UI的操作
- iOS开发多线程篇—GCD的基本使用
- iOS开发多线程篇—GCD的常见用法
- iOS开发多线程篇—GCD的常见用法
- iOS开发多线程篇--GCD
- iOS开发之GCD -- dispatch_group
- iOS开发 - 第03篇 - 多线程 - 02 - GCD & 单例 & NSOperation
- iOS开发——多线程、NSThread、gcd、线程间通信
- IOS多线程开发之GCD
- iOS开发多线程篇—GCD的常见用法
- [IOS 开发] GCD学习 dispatch_barrier_async