GCD(Grand Central Dispatch) : 牛逼的中枢调度器。苹果自带,纯C语言实现,提供了非常多且强大的函数,它可以提高代码的执行效率与多核的利用率。
一、GCD的基本使用
1、
GCD
中的
两个核心
概念
:
•
任务
:
执行什么任务
.
•
队列
:
用来存放任务
. (
用来调度任务
)
2、
GCD
使用的
2
个步骤
:
•
1.定
制
任务
.
(
确定想做的事情
)
•
2
.
将
任务添加
到队列中
.
•
GCD
会
自动
将
队列
中的任务
取出
,
放到
对应的线程
中执行
.
•
遵循队列的
FIFO
原则
:
先进先出
.
3、
同步和异步
的区别
: (是否开启新线程)
•
同步
:
在当前线程中执行
.
•
异步
:
在另一条线程中执行
.
4、并行与串行队列 : (任务的执行方式)
•并行对列
:
在
异步
情况下
,
让多个任务
并发执行
.
•
串行队列
:
一个任务
执行完后
,
再执行
下一个任务
.
队列又分为几种:自定义的队列、全局队列、主队列
基本使用代码如下:
- - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
- [self gcdDemo4];
- }
-
- #pragma mark - 串行队列
- - (void)gcdDemo1{
-
-
-
- dispatch_queue_t q = dispatch_queue_create("myQueueName", DISPATCH_QUEUE_SERIAL);
-
- NSLog(@"%@", [NSThread currentThread]);
-
-
- for (int i = 0; i < 10; i++) {
- dispatch_sync(q, ^{
- NSLog(@"%@ - %d", [NSThread currentThread], i);
- });
- }
-
-
-
-
-
-
- for (int i = 0; i < 10; i++) {
- dispatch_async(q, ^{
- NSLog(@"%@ - %d", [NSThread currentThread], i);
- });
- }
- }
-
-
- #pragma mark - 并行队列
- - (void)gcdDemo2{
-
- dispatch_queue_t q = dispatch_queue_create("myQueueName", DISPATCH_QUEUE_CONCURRENT);
-
-
-
-
-
-
- for (int i = 0; i < 10; i++) {
- dispatch_sync(q, ^{
- NSLog(@"%@ - %d", [NSThread currentThread], i);
- });
- }
-
-
-
-
-
- for (int i = 0; i < 10; i++) {
- dispatch_async(q, ^{
- NSLog(@"%@ - %d", [NSThread currentThread], i);
- });
- }
- }
-
-
- #pragma mark - 全局并行(并发)队列(使用更为普遍一些)
- - (void)gcdDemo3{
-
- dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
-
-
-
- for (int i = 0; i < 10; i++) {
- dispatch_sync(q, ^{
- NSLog(@"%@ - %d", [NSThread currentThread], i);
- });
- }
-
-
- for (int i = 0; i < 10; i++) {
- dispatch_async(q, ^{
- NSLog(@"%@ - %d", [NSThread currentThread], i);
- });
- }
- }
-
-
- #pragma mark - 主队列(专门调度在主线程上工作的队列,不能开线程)
- - (void)gcdDemo4{
-
- dispatch_queue_t q = dispatch_get_main_queue();
-
-
-
-
-
-
-
- for (int i = 0; i < 10; i++) {
- dispatch_async(q, ^{
- NSLog(@"%@ - %d", [NSThread currentThread], i);
- });
- }
- }
二、GCD进行线程间通讯
这里从主线程调用下载图片的方法,开启一个线程下载,然后在该线程任务完成后,返回主线程。
- - (void)downloadImage{
-
- dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
-
-
- dispatch_async(queue, ^{
- NSLog(@"开始下载图片 %@", [NSThread currentThread]);
-
- NSLog(@"完成下载图片 %@", [NSThread currentThread]);
-
-
-
- dispatch_async(dispatch_get_main_queue(), ^{
-
- });
- });
- }
下面的2篇不错,可以更好的理解:
http://blog.youkuaiyun.com/onlyou930/article/details/8225906
http://www.cnblogs.com/pure/archive/2013/03/31/2977420.html
转载请注明出处:http://blog.youkuaiyun.com/xn4545945