多线程简介及GCD的使用
多线程简介:
对于任意一个iOS应用,程序运行起来后,默认会产生一个主线程(MainThread),主线程专门用来处理UIKit对象的操作,如界面的显示与更新、处理用户事件触发的操作等等。(记忆这点,所有与UI相关的操作都要在主线程中进行)
对于一个App应用来说,之所以需要引入多个线程,很大程度上是由于有一些操作是非常耗时的,例如:发送网络请求并等待服务器的响应,这种耗时操作是不能 够放在主线程中进行操作的,因为在等待的时间内,主线程被使用,用户是不能做任何交互动作的,因而会极大影响用户体验。对于耗时的操作,需要再另外创建一 个线程,放到后台处理,当处理完成得到结果后,再返回主线程去设置UI界面,这就涉及到线程间通信的相关知识。
那什么是GCD呢?
GCD(Grand Central Dispatch)技术,苹果首先应用于OSX中,随后在iOS中也引入了GCD技术。特别是苹果手机把CPU升级为多核后,GCD的使用变得更加广泛和 重要。相比于NSThread, GCD中已经完全屏蔽了有关线程的概念,而是引入了任务和队列,把任务放到队列中执行,制定任务和队列的类型,有关线程管理的事务完全交由GCD来处理, 大大简化了多任务开发的难度。在GCD中,程序员已经不再需要去关心有关线程的操作(如:线程创建、线程销毁、线程调度),而是引入了任务和队列两个核心概念。
由于GCD对线程管理进行了封装,因此,当工程师使用GCD时,只需要把任务(通常封装在一个block中)添加到一个队列中执行,有关线程调度的工作,完全交由GCD完成。
在使用GCD处理多任务执行时,只要按照如下步骤执行即可,
- 在block中定义需要执行的任务内容;
- 把任务添加到队列queue中
GCD对队列中的任务,按照“先进先出”的原则,根据任务添加到队列的顺序来对队列进行处理,GCD会根据任务和队列的类型,自动在多个线程之间分配工作。
GCD中,队列是一个重要概念。系统提供了若干预定义的队列,其中包括可以获取应用程序的主队列(任务始终在主线程上执行,UI操作需要在主队列中完成)。
GCD队列严格按照“先进先出”的原则,添加到GCD队列中的任务,始终会按照加入队列的顺序被执行。
GCD中最常见的是串行队列和并行队列:
- 并行队列:并行队列中的任务可以在多个线程之间分配执行,分配的原则由GCD控制,因此,并行队列中的任务,虽然分配执行时按照先进先出进行分配的,但由于各个任务被分配到不同的线程执行,因此其完成时间有可能不同,即:后分配的任务有可能先执行完成;并发队列一定需要和异步执行的任务(使用 dispatch_async())结合起来使用才有意义。
- 串行队列:串行队列中的任务是按照顺序一个一个完成的,当一个任务完成后,才去执行下一个任务;因此,串行队列对应一个线程执行。
- 主队列:主队列也是一个串行队列,主队列中的任务都在主线程中执行。
接下来用代码来清晰的展示GCD的功能.
//CGD以队列的形式进行操作的,特点:"先进先出"
#pragma mark - 使用GCD去创建一个串行队列
//第一种:系统提供的创建串行队列的方法(主线程main)
dispatch_queue_t queue = dispatch_get_main_queue();
//真正的开发中如果需要创建串行队列,比较习惯用这种
//第二种:自己去创建(串行队列:SERIAL)
//参数一:是系统提供的一个宏
//参数二:是系统的保留字段
//两个参数的位置没有严格的限定,只要写这个两个参数即可
dispatch_queue_t queue = dispatch_queue_create(DISPATCH_QUEUE_SERIAL, ); #pragma mark - 使用GCD创建并行队列
//第一种方式(全局并行队列)
//参数一:优先级(有四个,没有明显的区别)
//参数二:系统保留字段
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
//第二种方式:自己创建的
//参数一:表示你这个队列的一个名字
//参数二:系统提供的宏
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
//有队列的,是根据队列去创建子线程,是没有固定顺序的,随机执行,下面创建5个子线程添加到并行队列中,运行可以看出,执行是没有固定顺序的.
dispatch_async(queue, ^{
NSLog(@"111%@, 111%@", [NSThread currentThread], [NSThread mainThread]);
}); dispatch_async(queue, ^{
NSLog(@"222%@, 222%@", [NSThread currentThread], [NSThread mainThread]);
}); dispatch_async(queue, ^{
NSLog(@"333%@, 333%@", [NSThread currentThread], [NSThread mainThread]);
}); dispatch_async(queue, ^{
NSLog(@"444%@, 444%@", [NSThread currentThread], [NSThread mainThread]);
}); dispatch_async(queue, ^{
NSLog(@"555%@, 555%@", [NSThread currentThread], [NSThread mainThread]);
}); #pragma mark - 几秒之后去做每一件事
//延时队列
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"3.0秒之后");
}); #pragma mark - 重复往一个队列中添加多个任务
//还是创建一个并行队列(CONCURRENT:并行,与最上面介绍的串行相对应)
dispatch_queue_t queue = dispatch_queue_create(, DISPATCH_QUEUE_CONCURRENT);
//添加多个任务
//参数一:任务的数量(重复执行100次)
//参数二:队列名,可以随便起个名,这里我就起名index
dispatch_apply(, queue, ^(size_t index) {
NSLog(@"%ld", index);
}); #pragma mark - 分组group
//创建一个分组(为了是安插监听函数)
dispatch_group_t group = dispatch_group_create();
//创建一个并行队列
dispatch_queue_t queue = dispatch_queue_create(, DISPATCH_QUEUE_CONCURRENT);
//创建任务一
dispatch_group_async(group, queue, ^{
NSLog(@"我是任务一");
});
dispatch_group_async(group, queue, ^{
NSLog(@"我是任务二");
}); //任务监管的函数,监听所有执行任务的执行情况的,必须放在所有任务的最下方
dispatch_group_notify(group, queue, ^{
NSLog(@"我是监考官");
});
GCD串行,并行
多线程简介及GCD的使用的更多相关文章
- iOS 多线程:『GCD』详尽总结
本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到: 1. GCD 简介 2. GCD 任务和队列 ...
- 多线程:『GCD』详尽总结
本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到:1. GCD 简介2. GCD 任务和队列3. ...
- iOS多线程知识总结--GCD
iOS多线程知识总结--GCD 1. iOS中苹果提供4钟方案来帮助我们实现多线程: (1) 纯C语言的pthread,偏底层,需要程序员手动管理线程的生命周期,基本不用. (2) OC语言的NSTr ...
- iOS开发多线程篇—多线程简介
iOS开发多线程篇-多线程简介 一.进程和线程 1.什么是进程 进程是指在系统中正在执行的一个应用程序 每一个进程之间是独立的.每一个进程均执行在其专用且受保护的内存空间内 比方同一时候打开QQ.Xc ...
- iOS多线程开发之GCD(中篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- Java多线程简介
Java多线程简介 Java中内置了对多线程的支持,让多线程的开发方便很多,但同时也带来了另外的复杂,线程间的交互以及很多的不确定性让多线程又显得很复杂.在此只是针对Java中多线程的基础做些说明,有 ...
- 多线程开发之三 GCD
NSThread.NSOperation.GCD 总结: 无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU 空闲时就会执行) 更新 UI 应该在 ...
- iOS多线程开发之GCD(死锁篇)
上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇) ...
- iOS多线程开发之GCD(中级篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
随机推荐
- IOS 上线问题
info.plist 是否支持后台位置 音频 Info.plist中添加UIBackgroundModes键值,它包含一个或多个string的值,包括 audio:在后台提供声音播放功能,包括音频流和 ...
- ReactiveCocoa学习笔记--用法
1.监测UI变量的变化 return 后把值传递下去. 1.1.输出 [self.usernameTextField.rac_textSignal subscribeNext:^(id x){ NSL ...
- OD提示 "为了执行系统不支持的动作, OllyICE 在这个被调试的程序中注入了一点代码, 但是经过5秒仍未收到响应..." 解决办法
别的OD就可以,我自己整合过的一个很顺手的OD就是不行,最后找到了解决办法: 转自:http://bbs.pediy.com/showthread.PHP?t=97629 -------------- ...
- HNU 13064 Cuckoo for Hashing解题报告 North America - East Central 2013
题目大意:使用两个哈希表来解决哈希冲突的问题.假如现在有两个哈希表分别为:H1,H2 ,大小分别为:n1,n2:现有一数据X需要插入,其插入方法为: 1.计算index1 = X MOD N1, 若 ...
- shell相关命令
1.shell是什么? 从用户角度:shell是用户与Linux沟通的桥梁 从程序员角度:shell本身是一种用C语言编写的程序 shell担任了翻译的角色,将用户输入的命令翻译成Linux能够识别的 ...
- iOS 之 二维码生成与扫描(LBXScan)
参考:https://github.com/MxABC/LBXScan 步骤如下: 1. 下载 通过参考网址进行下载. 2. 导入 导入整个LBXScan文件夹 3. 配置 在pch中加入 #impo ...
- WEB 开发者应该具备的 6 大技能?
1. 界面和用户体验 注意,浏览器的实现标准是不一致的,请确保你的网站能够兼容所有主流的浏览器.最少需要测试的有 Gecko 引擎 (Firefox),WebKit引擎(Safari以及一些手机浏览器 ...
- 网页代码DIV+CSS布局积累
11.17 CSS英文命名在写CSS的时候,经常为一些名字而发愁,比如说菜单后面的背景要用什么词来表示呢?大家都知道,菜单一般用menu来表示,那么菜单后面的背景我会用menubg,CSS里就写#me ...
- php实现断点下载
HTTP断点续传原理 Http头 Range.Content-Range() HTTP头中一般断点下载时才用到Range和Content-Range实体头, Range用户请求头中,指定第一个字节的位 ...
- 选项卡(TabHost)的功能与用法
TabHost是一种非常实用的组件,TabHost可以很方便地在窗口上放置多个便签页,每个标签页相当于获得了一个与外部容器相同大小的组件摆法区域.通过这种方式,就可以在一个容器里放置更多组件,例如手机 ...