GCD:Grand Central Dispatch。我理解的就是“宏观调控”。是苹果开发的一种支持并行操作的机制。它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务。
首先是创建一个队列。然后在这个队列中可以执行一些方法。
1.创建队列:
dispatch_queue_t diq = dispatch_queue_create("CNBLOGS.COM", NULL);
2.使用创建好的队列:
dispatch_async(diq, ^{ long long sum = 0; for (long long i = 0; i < 955350000; i++) { sum +=i; } });
使用创建好的队列来计算一个很大的数的操作。(费时操作写在这里面)
3.将计算好的数据返回到用户界面。(返回到主队列中,子队列中不可以对UI界面元素进行设置的)
把上面第2步的代码替换成
dispatch_async(diq, ^{ long long sum = 0; for (long long i = 0; i < 955350000; i++) { sum +=i; } dispatch_async( dispatch_get_main_queue(), ^{ NSLog(@"hello"); label.text = @(sum).description; }); });
4.在这里是在ARC模式下,所以没有必要手动释放队列,如果是在MRC下,要把创建的队列给release 掉。
《》《》《》《》《》《》《》《》》《》《》《》》《》《》《》《》《》《》《》《》《》《》《》《》《》《》《》《》《》《》》《》
下面说说GCD是什么东东。
GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行(但不保证一定先执行结束)。
通过与线程池的配合,dispatch queue分为下面两种:
Serial Dispatch Queue -- 线程池只提供一个线程用来执行任务,所以后一个任务必须等到前一个任务执行结束才能开始
Concurrent Dispatch Queue -- 线程池提供多个线程来执行任务,所以可以按序启动多个任务并发执行。
dispatch_queue_t q = dispatch_queue_create("lan.com", DISPATCH_QUEUE_SERIAL);//创建并行队列。 dispatch_queue_t q1 = dispatch_queue_create("LAN2.COM", DISPATCH_QUEUE_CONCURRENT);//创建串行队列。
而系统默认就有一个串行队列main_queue和并行队列global_queue:
dispatch_queue_t global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //获取系统中的默认的全局queue(并行队列) dispatch_queue_t main_queue = dispatch_get_main_queue();//获取系统中的串行队列。
通常,我们可以在global_queue中做一些long-running的任务,完成后在main_queue中更新UI,避免UI阻塞,无法响应用户操作:
上面提到dispatch_async这个接口,用来提交blcok给指定queue进行异步执行。这个接口会在成功提交block后立即返回,然后继续执行下去。由于block是定义在栈上的,所以需要将其复制到堆上,见这里。
与之相对应的是dispatch_sync接口,提交block以供同步执行。这个接口会等到block执行结束才返回,所以不需要复制block。So,如果在调用该接口在当前queue上指派任务,就会导致deadlock。
什么时候使用并发的呢?
如果追求的是并发,那么dispatch_sync有什么用呢?关于dispatch_sync的用途,SO上有讨论。
文章有的引用自:http://blog.csdn.net/onlyou930/article/details/8225906