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{
// 1. 串行队列
// 在使用GCD的时候,先敲dispatch
// 在C语言中,定义对象一般是以 _t 或者 Ref 结尾的
dispatch_queue_t q = dispatch_queue_create("myQueueName", DISPATCH_QUEUE_SERIAL); //DISPATCH_QUEUE_SERIAL 的值为 NULL NSLog(@"%@", [NSThread currentThread]); // 2. 同步任务 sync(实际开发中没用)
for (int i = 0; i < 10; i++) {
dispatch_sync(q, ^{
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
} // 2. 异步任务 async,可以开线程
// 串行队列中,异步任务最多仅仅能开一条线程。全部任务顺序运行。
// 串行队列,异步任务,在多线程中,是斯坦福大学最推荐的一种多线程方式。
// 长处:将任务放在其它线程中工作,每一个任务顺序运行,便于调试
// 缺点:并发能力不强。最多仅仅能使用一条线程!
for (int i = 0; i < 10; i++) {
dispatch_async(q, ^{
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
}
} #pragma mark - 并行队列
- (void)gcdDemo2{
// 1. 并行队列
dispatch_queue_t q = dispatch_queue_create("myQueueName", DISPATCH_QUEUE_CONCURRENT); // 非ARC中,须要自己释放队列
// dispatch_release(q); // 2. 同步任务。不会开启新的线程
// 在实际开发中,同步任务可以保证运行完毕之后,才让兴许的异步任务開始运行,用于控制任务之间的先后顺序。如在后台线程中。处理“用户登录”等
for (int i = 0; i < 10; i++) {
dispatch_sync(q, ^{
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
} // 3. 异步任务,会在多条线程上工作,详细开多少条线程,由系统决定
// 仍然是依照任务加入到队列中的顺序被调度,仅仅是运行先后可能会有差异! // *** 可以将耗时的操作,放到子线程中工作
// *** 与串行队列异步任务相比,并发性能更好! 可是运行的先后顺序,不固定
for (int i = 0; i < 10; i++) {
dispatch_async(q, ^{
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
}
} #pragma mark - 全局并行(并发)队列(使用更为普遍一些)
- (void)gcdDemo3{
// 1. 获取全局队列(与自己定义并行队列的差别就是名字显示,其它都一样)
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 使用全局队列,不须要考虑共享的问题 // 2. 同步任务
for (int i = 0; i < 10; i++) {
dispatch_sync(q, ^{
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
} // 3. 异步任务
for (int i = 0; i < 10; i++) {
dispatch_async(q, ^{
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
}
} #pragma mark - 主队列(专门调度在主线程上工作的队列,不能开线程)
- (void)gcdDemo4{
// 1. 获取主队列
dispatch_queue_t q = dispatch_get_main_queue(); // 2. 不要同步任务(死锁! !! )
// dispatch_sync(q, ^{
// NSLog(@"不会输出的!!!");
// }); // 3. 异步任务。在主线程上依次顺序运行
for (int i = 0; i < 10; i++) {
dispatch_async(q, ^{
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
}
}

二、GCD进行线程间通讯

这里从主线程调用下载图片的方法。开启一个线程下载,然后在该线程任务完毕后,返回主线程。

- (void)downloadImage{
// 1. 全局并行队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 2. 异步任务
dispatch_async(queue, ^{
NSLog(@"開始下载图片 %@", [NSThread currentThread]);
//。。。。
NSLog(@"完毕下载图片 %@", [NSThread currentThread]); // 3. 通知主队列更新UI
// 给主队列,加入一个异步任务。更新UI
dispatch_async(dispatch_get_main_queue(), ^{
//能够做更新UI操作。。 。 。
});
});
}

以下的2篇不错,能够更好的理解:

http://blog.csdn.net/onlyou930/article/details/8225906

http://www.cnblogs.com/pure/archive/2013/03/31/2977420.html

转载请注明出处:http://blog.csdn.net/xn4545945  

版权声明:本文博主原创文章,博客,未经同意不得转载。

【iOS】多线程GCD的更多相关文章

  1. iOS多线程 GCD

    iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main que ...

  2. iOS 多线程GCD的基本使用

    <iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...

  3. iOS 多线程 GCD part3:API

    https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 ...

  4. ios多线程-GCD基本用法

    ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法 平时比较多使用和看到的是: dispatch_async(dispatch_get_global_q ...

  5. iOS多线程——GCD与NSOperation总结

    很长时间以来,我个人(可能还有很多同学),对多线程编程都存在一些误解.一个很明显的表现是,很多人有这样的看法: 新开一个线程,能提高速度,避免阻塞主线程 毕竟多线程嘛,几个线程一起跑任务,速度快,还不 ...

  6. iOS多线程GCD的使用

    1. GCD 简介 Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的Di ...

  7. iOS多线程GCD详解

    在这之前,一直有个疑问就是:gcd的系统管理多线程的概念,如果你看到gcd管理多线程你肯定也有这样的疑问,就是:并发队列怎么回事,即是队列(先进先出)怎么会并发,本人郁闷了好久,才发现其实cgd管理多 ...

  8. iOS多线程GCD的简单使用

    在iOS开发中,苹果提供了三种多线程技术,分别是: (1)NSThread (2)NSOperation (3)GCD 简单介绍一下GCD的使用. GCD全称 Grand Central Dispat ...

  9. iOS多线程——GCD篇

    什么是GCD GCD是苹果对多线程编程做的一套新的抽象基于C语言层的API,结合Block简化了多线程的操作,使得我们对线程操作能够更加的安全高效. 在GCD出现之前Cocoa框架提供了NSObjec ...

  10. iOS 多线程GCD简介

    一.简介 1.1 GCD (Grand Central Dispatch )是Apple开发的一个多核编程的解决方法. Grand 含义是“伟大的.宏大的”,Central含义“中央的”,Dispat ...

随机推荐

  1. Android学习笔记(四十):Preference使用

    Preference从字面上看偏好,译为首选项. 一些配置数据,一些我们上次点击选择的内容.我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择.Android提供preference这 ...

  2. android AIDL RPC 机制

    AIDL 这是接口文件的叙述性说明,为了实现android 上述平台RPC ,aapt 在编译时自己主动按照该规则IPC 的接口和对象,作为一个用户只需要 实现在服务侧的界面 2 在clientbin ...

  3. Arduino 数码管LED驱动 数组法

    上个样例讲到驱动LED数码管,採用一种最直接的方案,对每一个LED进行高低电平的控制,这种长处是每一个LED都是受控可检的,避免了因为短路造成的假象,但对于数字变化来说,写起来就很冗余,因此这次尝试用 ...

  4. 解决 下载 CM-12.0 源代码出现 Fatal: duplicate project .....问题

    在使用 repo init -u git://github.com/CyanogenMod/android.git -b cm-12.0 初始化代码库的时候出现如下错误: fatal: manifes ...

  5. OpenCV在MFC图像控件内显示图像

    1.依照文章<OpenCV+MFC显示图像>,完毕配置. 2.创建对应的图像控件,button控件. 3.进行类型转换. 在当前OpenCV2版本号内,图像格式为cv::Mat ,而该格式 ...

  6. JQuery操作select checkbox radio总结

    JQuery是一个非常强大的工具,所以我必须找到它最方便的方法,嘻嘻 Select CRUD: Select搜: 1.val值: $("#selectid").val();     ...

  7. Byte[]和BASE64之间的转换

    一. BASE64编码 把byte[]中的元素当做无符号八位整数转换成只含有64个基本字符的字符串,这些基本字符是: l 大写的A-Z l 小写的a-z l 数字0-9 l '+' 和 '/' l 空 ...

  8. 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

    原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...

  9. gerrit git使用

    有关git的參考资料 pro git中文版, 最好的git书籍 http://git-scm.com/book/zh 图解git http://marklodato.github.com/visual ...

  10. 【Android进阶】Activity和Fragement中onSaveInstanceState()的使用详解

    在activity(或者是fragement)被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle) (传 ...