文档章节

iOS开发多线程篇---GCD的介绍和简单使用

琳小兮
 琳小兮
发布于 2015/03/05 14:58
字数 1368
阅读 1089
收藏 5

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

 - (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];
    });
}
-(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

   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去得到队列,如下:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

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

dispatch_queue_t mainQueut = dispatch_get_main_queue();

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

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


© 著作权归作者所有

共有 人打赏支持
琳小兮
粉丝 30
博文 37
码字总数 20169
作品 0
襄阳
程序员
加载中

评论(1)

花间小酌
花间小酌
不错 我顶
关于iOS多线程,这边勉强可以看看(OC&Swift)

iOS开发多线程总是绕不过的坎,看了很多前辈们优秀的文章,如:关于iOS多线程,我说,你听,没准你就懂了!、谈iOS多线程(NSThread、NSOperation、GCD)编程、iOS多线程:『GCD』详尽总结、i...

Andy_Ron
08/26
0
0
iOS multiple threads(2)------GCD

前面一二也说过,iOS中多线程编程工具主要有: NSThread NSOperation GCD 这三种方法都简单易用,各有千秋.同NSThread相比,GCD的运行效率更高,开发更简单。 但GCD确是诱惑力的,因为其本身是...

辉兔狼
2013/03/24
0
0
iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用

iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用 目录(?)[+] 介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理...

malawo
2013/09/05
0
0
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
05/26
0
0
(转)直接拿来用!最火的iOS开源项目(二)

“每一次的改变总意味着新的开始。”这句话用在iOS上可谓是再合适不过的了。GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x到如今的iOS 7,有的项目...

孙启超
2013/06/21
0
1

没有更多内容

加载失败,请刷新页面

加载更多

腾讯三大运维开源项目齐聚“OSCAR开源先锋日”

10月20日,腾讯开源三大运维开源项目——TARS、蓝鲸和织云Metis首次集结,参与了由中国信息通信研究院主办、云计算标准与开源推进委员会承办的 “OSCAR开源先锋日”。会上,腾讯开源团队与前...

腾讯开源
3分钟前
0
0
JAVA并发-从缓存一致性说volatile 讲的很好

学过计算机组成原理的一定知道,为了解决内存速度跟不上CPU速度这个问题,在CPU的设计中加入了缓存机制,缓存的速度介于CPU和主存之间。在进行运算的时候,CPU将需要的数据映射一份在缓存中,...

码代码的小司机
21分钟前
0
0
IDEA 调试功能

1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试。 IDE下方出现Debug视图,红色的箭头指向的是现在调试程序...

狼王黄师傅
29分钟前
0
0
Java面试170题

1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? 4、float f=3.4;是否正确? 5、short s1 = 1; s1 = ...

lanyu96
34分钟前
0
0
优雅的写出类

前言 虽然现在已经是ES6的时代,但是,还是有必要了解下ES5是怎么写一个类的。 本文详述JavaScript面向对象编程中的类写法,并分步骤讲述如何写出优雅的类。 一、例子 例子为一个轻提示组件T...

peakedness丶
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部