IOS 多线程03-GCD
如果在本文之前要了解一下线程的基本知识,请访问下面的网址:http://www.cnblogs.com/alunchen/p/5337608.html
1.简介
GCD不仅适用于Object-C,也适用于C、C++
GCD在C接口中添加了一些优秀的概念,比如工作单元、无痛后台处理(painless background processing)、自动线程管理,他们可在所有基于C的语言中使用。
GCD的重要一个概念是队列,可以保证始终在主线程上执行工作的队列,非常适合非线程安全的UIKit。也可以自己创建队列。
GCD队列遵循FIFO(先进先出)原则。
2.使用之前-block
在使用GCD之前,一定要理解新语法block的使用,对于尽量充分利用GCD非常重要。block可替代object-c中的委托模式或C中的回调函数。这里不详细介绍block了,请参照下面文章 http://www.cnblogs.com/alunchen/p/5341057.html
3.开启新线程与主线程
下面我们用GCD开启一个新线程。注意的是当我们执行下面的方法,当执行完doSomething(),其实startTime已经释放了,但是注意的block一个关键点是,如果一个程序块block在执行过程中访问任何的‘外部’变量,那么该程序块block被创建时会进行一些特殊的设置工作,以允许程序块访问这些变量。所以,其实在调用dispatch_async时,startTime被retain了一次,而且程序块block内部赋给了一个内部同名startTime的新的不可变的变量。
-(void) doSomething() {
NSDate *startTime = [NSDate date];
//取得一个全局队列,优先级为DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
//开启异步线程
dispatch_async(queue, ^{
//在这里做一些任何耗时的处理
NSDate *endTime = [NSDate date];
NSLog(@"完成时间:%f", [endTime timeIntervalSinceDate: startTime]);
});
}
上面创建了一个异步线程,但是我们想要在异步线程中做任何更新等UI操作是不可能的,下面例子是执行完线程后,获取主线程做UI操作:
-(void) doSomething() {
NSDate *startTime = [NSDate date];
//取得一个全局队列,优先级为DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
//开启异步线程
dispatch_async(queue, ^{
//在这里做一些任何耗时的处理
//得到主线程,做UI操作
dispatch_async(dispatch_get_main_queue(), ^{
//在这里做一些更新UI等UI操作
});
});
}
4.并发程序块-dispatch group(提高执行速度)
如果在新开启的异步线程A中,运行需要的时间大概需要10秒,那么我们想象一下,这个运行时间会不会太长。现在,IOS提供了一个dispatch group分派组给我们快速的执行。原理是将一个组的上下文中通过dispatch_group_async()函数异步分派的所有程序块同时运行,那就不需要10秒那么长的时间了。也可以使用dispatch_group_notify()指定一个额外的程序块,让它在组中的所有程序块运行完成时再执行。可看下面例子:
//上面的doSomething()需要10秒,这里的少于10秒
-(void) doSomething() {
NSDate *startTime = [NSDate date];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
//开启异步线程
dispatch_async(queue, ^{
//在这里做一些任何耗时的处理
doSomething2(); //这里开始定义group
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
//这里这一些其他的耗时处理
doSomething3();
}); //等待上面所有的线程运行完,这里才执行(notify的作用)
dispatch_group_notify(group, queue, ^{
dispatch_async(dispatch_get_main_queue(), ^{
//做一些主线程更新UI的操作
doSomethingWithUI();
});
}); });
}
IOS 多线程03-GCD的更多相关文章
- [iOS]多线程和GCD
新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...
- iOS多线程 NSThread/GCD/NSOperationQueue
无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...
- iOS 多线程 之 GCD(大中枢派发)(一)
导语: 本文个人原创,转载请注明出处(http://www.cnblogs.com/pretty-guy/p/8126981.html) 在iOS开发中多线程操作通常是一下3种,本文着重介绍Dispa ...
- IOS多线程(GCD)
简介 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首次 ...
- ios 多线程小结----- GCD篇
//3 GCD(充分利用设备的多盒)-------------屏蔽了线程,只能看见任务 队列步骤两步,定制任务,将任务添加到队列.GCD将添加的任务,放到线程中去执行,自动执行,自动释放原则:先进先出 ...
- IOS 多线程 NSOperation GCD
1.NSInvocationOperation NSInvocationOperation * op; NSOperationQueue * que = [[NSOperationQueuealloc ...
- iOS 多线程之 GCD 的基本使用
什么是GCD 全称Grand Central Dispatch 中暑调度器 纯C语言 提供了很多强大的函数 GCD 的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU ...
- iOS 多线程 之 GCD(大中枢派发)(二)
本文接着上一篇讲.主要讲:dispatch_source. dispatch_source主要用户监听事件,可以监听如下事件 DISPATCH_SOURCE_TYPE_DATA_ADD DISPATC ...
- iOS 多线程:『GCD』详尽总结
本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到: 1. GCD 简介 2. GCD 任务和队列 ...
- iOS 多线程 GCD part3:API
https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 ...
随机推荐
- Cracking-- 17.13 将二叉树转换成双向链表
在书的105页 使用中根遍历的思想 left 之后 为 root 之后 为 right 则对左子树来说 left->right = root; root->left = left; 对右子 ...
- 修改Linux可显示的行数
在/boot/grub/menu.lst中,找到kernel开头的那一行,在后面加上参数vga=791 下面是vga可以取的值 # +----------------------------- ...
- Async and Await
http://blog.stephencleary.com/2012/02/async-and-await.html Most people have already heard about the ...
- ERDAS文件格式:IGE、IMG、RRD、AUX
ERDAS如果需要打开大于2GB的文件,ERDAS需要把文件转换成IMG格式.这时候,ERDAS自动生成三个文件,分别是IMG.IGE和RRD文件,其中:1.IGE:是数据文件,实际用来存储栅格数据: ...
- Github 新的项目管理模式——Projects
Github 新的项目管理模式--Projects Issues Github 中传统的项目管理是使用 issue 和 pull request 进行的,这部分内容不是本文重点,不再赘述. 但有一些功 ...
- Fragment要点复习
做系统时间久了,应用层的很多东西都忘了,但是基础还是得巩固,下面对fragment相关的知识点简单整理一下. 一.fragment的引入 fragment是从Android3.0(API level ...
- 天气预报API(五):城市代码--“新编码”和“旧编码” 对比
参考一些博客.文章 来查找 测试 接口,后来发现两套城市编码标准,有点想法,故拿来对比分析. 注:新旧编码是个人主观叫法,只是为了方便称呼,可能有不当之处,请留言更正. 暂且称 中国天气网等网站使用的 ...
- javascript变量问题
CMAScript变量包含两种不同数据类型的值: 基本类型值:简单的数据段:引用类型值:可能有多个值构成的对象. 5种基本类型:Undefined,Null,Bollean,Number,String ...
- VIM使用(一) VIM插件管理利器-vundle
有关VIM的文件网上一大堆,这里只是记录一下我新配置环境的步骤.以备查看参考. sudo apt-get install gitgit clone https://github.com/gmarik/ ...
- usage of elinks (命令行下的firefox)
No.0 Press "Esc" to show main menu ============================================= No.1 tyep ...