GCD总结(一)

简介:
GCD为我们提供了三种类型的调度队列(dispatch queue),分别为串行,并行和主调度队列。

    串行(Serial)

    你可以创建任意个数的串行队列,每个队列依次执行添加的任务,一个队列同一时刻只能执行一个任务(串行),但是各个队列之间不影响,可以并发执行。每个队列中的任务运行在一个由各自串行队列维护的独立线程上,一个队列中只有一个线程。
  下面,我将创建一个串行队列,添加两个任务,来演示串行执行的过程。
复制代码
复制代码
 1 UInt32 loopCount = 1000;
 2     
 3     void (^taskFirst)(void) = ^{
 4         NSLog(@"taskFirst 任务开始执行\r\n");
 5         
 6         for (UInt32 i = 0; i < loopCount; i++) {
 7             
 8         }
 9         NSLog(@"taskFirst 任务结束\r\n");
10     };
11     
12     void (^taskSecond)(void) = ^{
13         NSLog(@"taskSecond任务开始执行\r\n");
14         for (UInt32 i = 0; i < loopCount; i ++) {
15             
16         }
17         NSLog(@"taskSecond 任务结束\r\n");
18     };
19     dispatch_queue_t serialQueue;
20     serialQueue = dispatch_queue_create("serialDemo", NULL);
21     dispatch_async(serialQueue, taskFirst);
22     NSLog(@"taskfirst 已经加入队列\r\n");
23     dispatch_async(serialQueue, taskSecond);
24     NSLog(@"tasksecond 已经加入队列\r\n");
复制代码
复制代码

运行得到结果1:

2012-05-14 18:45:01.766 GDCDemo[389:f803] taskfirst 已经加入队列

2012-05-14 18:45:01.766 GDCDemo[389:11103] taskFirst 任务开始执行

2012-05-14 18:45:01.767 GDCDemo[389:f803] tasksecond 已经加入队列

2012-05-14 18:45:01.768 GDCDemo[389:11103] taskFirst 任务结束

2012-05-14 18:45:01.768 GDCDemo[389:11103] taskSecond任务开始执行

2012-05-14 18:45:01.772 GDCDemo[389:11103] taskSecond 任务结束

运行结果跟我们的预计一样,taskFirst执行完之后,才执行taskSecond。而且,通过“xxx任务加入队列”的提示,任务运行的线程跟主线程不是同一个。

下面,我们继续对代码做点调整,让它演示不同队列之间的任务并行运行。

复制代码
复制代码
 1 UInt32 loopCount = 1000;
 2     UInt32 loopCountFirst = 10000000;
 3     
 4     void (^taskFirst)(void) = ^{
 5         NSLog(@"taskFirst 任务开始执行\r\n");
 6         
 7         //延长taskFirst的运行时间
 8         for (UInt32 i = 0; i < loopCountFirst; i++) {
 9             
10         }
11         NSLog(@"taskFirst 任务结束\r\n");
12     };
13     
14     void (^taskSecond)(void) = ^{
15         NSLog(@"taskSecond任务开始执行\r\n");
16         for (UInt32 i = 0; i < loopCount; i ++) {
17             
18         }
19         NSLog(@"taskSecond 任务结束\r\n");
20     };
21     dispatch_queue_t serialQueue;
22     serialQueue = dispatch_queue_create("serialDemo", NULL);
23     //创建第二个队列
24     dispatch_queue_t serialQueueSecond = dispatch_queue_create("serialSecondDemo", NULL);
25     dispatch_async(serialQueue, taskFirst);
26     NSLog(@"taskfirst 已经加入队列\r\n");
27     dispatch_async(serialQueueSecond, taskSecond);
28     NSLog(@"tasksecond 已经加入队列\r\n");
复制代码
复制代码

运行得到结果2:

2012-05-14 19:07:22.951 GDCDemo[456:f803] taskfirst 已经加入队列

2012-05-14 19:07:22.951 GDCDemo[456:11103] taskFirst 任务开始执行

2012-05-14 19:07:22.953 GDCDemo[456:f803] tasksecond 已经加入队列

2012-05-14 19:07:22.953 GDCDemo[456:12c03] taskSecond任务开始执行

2012-05-14 19:07:22.954 GDCDemo[456:12c03] taskSecond 任务结束

2012-05-14 19:07:22.977 GDCDemo[456:11103] taskFirst 任务结束

由此可见,taskSecond是添加到队列后立即执行的。两个串行队列之间的任务是互不影响的。

 

    并行(Concurrent)

    并行队列是不允许自己创建的,系统中存在三个不同优先级的并行队列。并行队列依旧按照任务添加的顺序启动任务,但是,后一个任务无须等待前一个任务执行完毕,而是启动第一个任务后,立即启动下一个任务。至于同一时刻允许同时运行多少个任务有系统决定。任务各自运行在并行队列为他们提供的独立线程上,并行队列中同时运行多少个任务,就必须维护多少个线程。
下面,我们将上一个程序的第21到28行替换为如下代码:
1 dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2     dispatch_async(concurrentQueue, taskFirst);
3     NSLog(@"taskfirst 已经加入队列\r\n");
4     dispatch_async(concurrentQueue, taskSecond);
5     NSLog(@"tasksecond 已经加入队列\r\n");

运行,结果与结果2相同。说明了,taskFirst和taskSecond是同时运行的。

  

    主调度队列(main dispatch queue)

    主调度队列中的任务运行在应用程序主线程上,所以,如果你要修改应用程序的界面,他是唯一的选择。
  演示代码如下:
   

 dispatch_async(dispatch_get_main_queue(), ^{

        .....//跟新界面的操作

    });

 
 
博客内容是我学习的总结,如果有错误,希望大家指出。
目录
相关文章
|
小程序 JavaScript 数据可视化
微信小程序innerHTML解决方案
小程序项目开发中有这么一个需求,接口返回 <div>abc<p>123</p></div> 字符串,然后在小程序页面显示。
1591 0
微信小程序innerHTML解决方案
|
机器人 测试技术 数据安全/隐私保护
IPPBX配置-如何实现FreePBX/VOS/鼎信网关外呼
目前市场上很多企业客户使用FreePBX来部署某些企业应用服务,有电话机器人,.有时,为了更加准确地实现计费功能,VOS作为一个计费和路由管理功能来和FreePBX集成对接。企业用户中,FreePBX或者外呼平台可以实现应用层的服务,包括智能外呼,呼叫中心外呼解决方案和企业IPPBX功能。今天,我们这里配置一个环境来说明企业内部分机如何通过FreePBX,VOS和鼎信通达网关实现落地服务。主要目的是为企业客户提供一个最完整和权威的FreePBX对接VOS和落地网关配置文档,以便让客户能够快速正确配置所有的相关信息。
1279 0
|
弹性计算 人工智能 运维
全面上云这条路,洋葱学院已经走了近7年
洋葱学院需要确保业务稳定性,采用阿里云容器服务与云数据库融合解决方案,在应用不变的情况下,快速平稳实现扩容的问题!
8503 92
全面上云这条路,洋葱学院已经走了近7年
|
JavaScript Java Shell
Anaconda介绍、安装及使用保姆级教程
Anaconda介绍、安装及使用保姆级教程
3533 1
Anaconda介绍、安装及使用保姆级教程
|
Web App开发 存储 缓存
一文带你了解如何排查内存泄漏导致的页面卡顿现象(上)
不知道在座的各位有没有被问到过这样一个问题:如果页面卡顿,你觉得可能是什么原因造成的?有什么办法锁定原因并解决吗?
1032 0
一文带你了解如何排查内存泄漏导致的页面卡顿现象(上)
|
存储 弹性计算 运维
AloT 企业物联网平台入门01(一)
AloT 企业物联网平台入门01(一)
1133 0
AloT 企业物联网平台入门01(一)
|
安全 Java 编译器
Kotlin | 关于 Lazy ,你应该了解的这些事
本文主要分享 Kotlin Lazy 相关,希望看完本篇,可以帮助到你更好的理解与使用。
721 0
Kotlin | 关于 Lazy ,你应该了解的这些事
|
Windows
这个Windows解决端口占用方法,真香!
这个Windows解决端口占用方法,真香!
1194 0
这个Windows解决端口占用方法,真香!
|
数据采集 小程序 Python
Python自动化赚钱?想peach!
还记得很久之前有一位读者在群里问过,有没有那种代码一键运行,就可以赚钱,当时年轻的我微微一笑,年轻人,想 peach?
744 0
Python自动化赚钱?想peach!
|
JavaScript iOS开发
Vue适配PC+大屏,手机+ipad适配
Vue适配PC+大屏,手机+ipad适配
1591 0
Vue适配PC+大屏,手机+ipad适配