文档章节

GCD的工作原理

JK_Jack
 JK_Jack
发布于 2015/10/19 17:26
字数 1484
阅读 67
收藏 0

           GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。 一个任务可以是一个函数(function)或者是一个block。 GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节。GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行。用gcd实现网络数据请求,比前面介绍的NSThread方法要简单的多。          

                GCD                  

 
                         

1.GCD的简介:

 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。而且是纯C语言,提供了非常多强大的函数。

2.GCD的工作原理是:

让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。一个任务可以是一个函数(function)或者是一个block。 GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节。

3.GCD的优势:

GCD是苹果公司为多核的并行运算提出的解决方案;

GCD会自动利用更多的CPU内核(比如双核、四核);

GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程);

程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码;

温馨提示:

GCD存在于libdispatch.dylib这个库中,这个调度库包含了GCD的所有的东西,但任何IOS程序,默认就加载了这个库,在程序运行的过程中会动态的加载这个库,不需要我们手动导入。

4.GCD的使用步骤和核心概念:

核心概率有2个:1)队列:用来存放任务  2)任务:执行什么操作

使用步骤有2步:1)定制任务 2)确定想做的事情

5.dispatch queue(队列)

GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行,dispatch queue分为下面三种:

1)Serial dispatch queues(串行队列),同时只执行一个任务(一个任务执行完毕以后,再执行下一个任务)。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。

2)Concurren dispatch queue(并发队列),可以并发地执行多个任务(可以让多个任务同时执行,自动开启多个线程同时执行任务,并发功能只有在异步函数(dispatch_async)下有效),但是执行完成的顺序是随机的。

3)Main dispatch queue(主队列),它是全局可用的serial queue(直接在主线程中串行执行任务),它是在应用程序主线程上执行任务的。

6.GCD执行任务的两种方式:

//将参数block(任务)提交给参数queue(队列)进行执行,参数说明:queue:队列   block:任务

(1)用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

(2)用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

7.为了避免界面在处理耗时的操作时卡死,比如读取网络数据,数据库读写等,我们会在另外一个线程中处理这些操作,然后通知主线程更新界面。创建一个全局并发队列,使用dispatch_async执行下载图片任务,然后再回到主线程中展示图片。

第一种方式---GCD结合NSThread

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  - ( void )viewDidLoad
{
     [super viewDidLoad];
  
     imagev = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
     [self.view addSubview:imagev];
     
  //说明:全局并发队列的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
     
     //第一个参数全局并发队列的优先级,第二个参数暂时无用,用0即可
     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
     //使用异步的方式dispatch_async执行任务,第一个参数获得全局的并发队列,第二个参数block(队列将要执行的任务)
     dispatch_async(queue, ^{
         //调用下载图片方法
         [self downImage];
     });
}

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-( void )downImage
{
     //从网络中下载图片
     NSURL *url = [NSURL URLWithString:@ "http://i8.topit.me/8/c1/31/1142319854bdc31c18o.jpg" ];
     //将图片转换为二进制数据
     NSData *imgData = [NSData dataWithContentsOfURL:url];
     //数据转换成图片
     UIImage *img = [UIImage imageWithData:imgData];
     
     //回到主线程设置图片
     [self performSelectorOnMainThread:@selector(senderImage:) withObject:img waitUntilDone:NO];
}
 
-( void )senderImage:(UIImage *)image
{
     imagev.image = image;
}

第二种方式---GCD

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         
         //从网络中下载图片
         NSURL *url = [NSURL URLWithString:@ "http://i8.topit.me/8/c1/31/1142319854bdc31c18o.jpg" ];
         //将图片转换为二进制数据
         NSData *imgData = [NSData dataWithContentsOfURL:url];
         //数据转换成图片
         UIImage *img = [UIImage imageWithData:imgData];
         
         dispatch_async(dispatch_get_main_queue(), ^{
             //回到主线程中设置图片显示
             imagev.image = img;
         });
     });

总结:系统给每一个应用程序提供了三个concurrent dispatch queues。这三个并发调度队列是全局的,它们只有优先级的不同。因为是全局的,我们不需要去创建。我们只需要通过使用函数 dispath_get_global_queue去得到队列,如下:

?

1
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

上面的例子中我们也用到了,系统默认就有的一个串行队列main_queue

?

1
dispatch_queue_t mainQueut = dispatch_get_main_queue();

他们的代码框架结构如下:

?

1
2
3
4
5
6
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
     //这里就做一些比较耗时的操作,如请求数据。。  
     dispatch_async(dispatch_get_main_queue(), ^{  
         //这里就是回到主线程去更新界面  
     });  
});

本文转载自:

共有 人打赏支持
下一篇: GCD
JK_Jack
粉丝 0
博文 6
码字总数 2658
作品 0
广州
私信 提问
多线程&NSObject&NSThread&NSOperation&GCD

1、NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程)以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题2、NSOperation/NSOperationQueu...

哥特复心
2013/12/30
0
1
iOS基础知识整理之多线程技术

多线程技术 多线程(multithreading) 是指软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。 原理...

无忌不悔
2018/11/07
0
0
iOS开发多线程篇---GCD的介绍和简单使用

1.GCD的简介: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。而...

琳小兮
2015/03/05
0
1
iOS 多线程GCD

一.简介 GCD (Grand Central Dispatch)是Apple开发的多核编程的解决方法。 二.优点 1.GCD可用于多核的并行运算 2.GCD自动利用更多CPU内核(双核,四核) 3.GCD自动管理线程的生命周期(创建线...

龙飞凤舞de心
2018/02/23
0
0
iOS OS X 和 iOS 中的多线程技术-4 (GCD)

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、GCD GCD(Grand Central Dispatch)是 Apple 公司为了提高 OS X 和 iOS 系统在多核处理器上运行并行代码的能力而开发的一系列相关技术,它...

石虎132
2017/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IDE 插件新版本发布,开发效率 “biu” 起来了

近日,Cloud Toolkit正式推出了面向 IntelliJ 和 Eclipse 两个平台的新款插件,本文挑选了其中三个重大特性进行解读,点击文末官网跳转链接,可查看详细的版本说明。 本地应用一键部署到任何...

阿里云官方博客
28分钟前
1
0
我是怎样和Linux系统结缘并通过红帽RHCE认证的

我高考完当时就是选择的计算机科学与技术专业,上大学以后联想到的和计算机相关的就只有写代码,开发,网站,网页设计,就没有其他的了,当时学习写代码也都是在Windows上,什么C#、C++之类的...

linuxprobe16
29分钟前
0
0
Coding and Paper Letter(四十四)

资源整理。 1 Coding: 1.Rstudio2019年会“机器学习应用”的幻灯片,代码和数据 rstudio conf 2019 2.R语言包sparkxgb,Spark上XGBoost的R接口。 sparkxgb 3.自动SQL注入和数据库接管工具。 ...

胖胖雕
今天
3
0
Ubuntu最新的主要操作系统放弃32位支持?

现在是2018年,2019年即将到来——64位处理器已经成为主流很长一段时间了。如果你仍然使用32位的电脑,那么是时候把它扔进垃圾箱了。 我为所有基于Linux的操作系统维护者感到自豪,他们有勇气...

Linux就该这么学
今天
2
0
Fundebug发布Vue插件,简化BUG监控接入代码

摘要: 代码越短越好! 我们发布了fundebug-vue插件,可以简化Vue框架接入Fundebug的代码。 Vue如何接入Fundebug 1. 安装fundebug-javascript与fundebug-vue npm install fundebug-javascrip...

Fundebug
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部