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对时间的描述有些新奇 ...
随机推荐
- SpringMVC 的RequestMapping
Spring MVC之@RequestMapping 详解 2013-10-13 23:39 150698人阅读 评论(6) 收藏 举报 分类: Java 精华文章(161) 目录(?)[+] ...
- Git 源代码管理工具
Git 源代码管理工具 Git基本信息 Git :Git是一个“分布式”的版本控制工具 Git的作者是Linux之父 Linus Benedict Torvolds,当初开发Git仅仅是为了辅助Lin ...
- css3动画之图片旋转
直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- 使用KeepAlived搭建MySQL高可用环境
使用KeepAlived搭建MySQL的高可用环境.首先搭建MySQL的主从复制在Master开启binlog,创建复制帐号,然后在Slave输入命令 2016年7月25日 配置安装技巧: ...
- IOS和Android支持的音频编解码
1.IOS编码 参考文档地址:https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/Multimedi ...
- 举例详解CSS中的cursor属性
这篇文章主要举例介绍了CSS中的cursor属性,包括zoom-in/zoom-out和grab/grabbing等常用属性值的使用,需要的朋友可以参考下 一.开篇之言 CSS3的领域范围已经渗透到了 ...
- iOS Developer:真机测试
如果出现ios development一项为灰色不可点击状态,苹果的说法是 如果您要为此电脑添加证书,请revoke以前的证书后添加,或者通过以前的mac导出证书 原文不记得了,大概这个意思,苹果不希 ...
- Hyper-V初涉:Hyper-V虚拟机常规操作
a. 连接到虚拟机与开机 在Hyper-V管理器中双击待启动的虚拟机或在待启动的虚拟机上右键选择"启动"即可完成连接虚拟机的操作. 若此时虚拟机正在运行则直接进入虚拟机界面,若虚拟 ...
- UI拼图导出脚本,兼容cegui的ImageSet格式
该脚本用于photoshop,美术可以先用photoshop拼接图片,在加载该脚本导出xml格式的文件,该文件记录了每个小的图片坐标信息 // Copyright 2002-2003. Adobe S ...
- List 源码分析笔记
List Class Diagram: 笔记一: 1.Iterable 接口只定义一个iterator()方法. Iterator 接口有hasNext, next, remove方法. ListIt ...