ios 多线程小结----- GCD篇
//3 GCD(充分利用设备的多盒)-------------
屏蔽了线程,只能看见任务 队列
步骤两步,定制任务,将任务添加到队列。GCD将添加的任务,放到线程中去执行,自动执行,自动释放
原则:先进先出,先添加的任务先执行,有别于栈的先进后出,先添加的任务后执行
-------GCD---
GCD有两个用来执行任务的函数:同步函数,异步函数
同步:按顺序执行任务,同一条线程执行(不开线程)
异步:同时执行任务(开启新线程)
同步,异步,并发,串行
同步:当前线程执行,不具备开启新线程的能力
异步:在新线程执行,具备开启新线程的能力
并发:多个任务同时执行,
串行:一个任务执行完毕,在执行下一个任务
<1> 创建全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
注释:建立一个全局队列,优先级为默认(队列的调度频率为默认),后面默认0,苹果官方说明,以后可能会有用,
dispatch_async(queue,)^{
NSLog(@"---任务1---%@",[NSThread currentThread]);
}
dispatch_async(queue,)^{
NSLog(@"---任务2---%@",[NSThread currentThread]);
}
dispatch_async(queue,)^{
NSLog(@"---任务3---%@",[NSThread currentThread]);
}
分析:决定是否开启线程的是函数async,异步则开启新线程,全局队列属于并发队列,即为任务可以同时执行,则执行方案为,开启三条线程(非主线程的三条新线程),同时执行三个任务。
若函数为sync,即为同步函数,同步不会开启新线程(即在当前线程中执行任务),主队列的并发则失去意义,任务是依次执行的,so 和串行一样了
<2>创建串行队列
dispatch_queue_t queue = dispatch_queue_creat("NiuBiDe.queue",NULL);
注释:""中为串行队列的名称
dispatch_async(queue,)^{
NSLog(@"---任务1---%@",[NSThread currentThread]);
}
dispatch_async(queue,)^{
NSLog(@"---任务2---%@",[NSThread currentThread]);
}
dispatch_async(queue,)^{
NSLog(@"---任务3---%@",[NSThread currentThread]);
}
分析:async为异步函数,则会开启新线程,串行队列为非并发队列,则执行方案为开启新的线程 在这条线程中依次执行1,2,3任务
若为同步函数,则在主线程中依次执行三个任务
<3>创建主队列
dispatch_queue_t queue = dispatch_get_main_queue();
主队列是特殊的串行队列 无论同步异步都都会在主线程中执行任务
切忌:如果在主线程中执行同步方法会出现死锁现象,所以主线程中需用异步主队列执行任务操作
应用:多用于处理耗时操作的子线程中 处理UI显示问题,创建主线程 异步显示UI之用
GCD总结:
dispatch_async(sync)(全局队列/主队列/串行队列)block^{
}
表格----
全局队列 串行队列 主队列
同步 不开启新线程 不开启新线程 不开启新线程
任务串行执行 任务串行执行 串行执行任务
异步 开启线程 开启线程 不开启线程
任务并发执行 任务串行执行 任务串行执行
其他用法:
- 延迟调用
对比 [self performSelected:@selected(run)withObject:nil afterDealy:2.0];当前线程延迟2.0秒调用run方法
dispatch_after(DISPATCH_TIME_NOW,(int64_t)(3.0* NSEC_PER_SEC),dispatch_get_main_queue()))^{
}
注释:dispatch_get_main_queue()即为在主队列中执行延迟操作,如果换成
全局队列则会在其他线程中执行操作!~ 牛B!~
- 一次性代码
dispatch_once ^{
}
注释:保证在整个程序运行中此代码只执行一次!~
- 队列组(神奇!~)
应用场景:当两个耗时操作都完成后,才操作UI显示,两个图片下载完毕后,合并显示在UI上
//创建队列组
dispatch_group_t group = dispatch_group_creat();
//开启下载任务1
dispatch_group_async(group,global_queue,^{
//还是操作1
})];
//开启下载任务2
dispatch_group_async(group,global_queue,^{
//还是操作2
})];
//等gruop中的任务都执行完毕,在执行其他操作
dispatch_group_notify(group,main_queue^{
//在主线程中,处理显示UI细节。
})];
ios 多线程小结----- GCD篇的更多相关文章
- iOS开发之多线程技术——GCD篇
本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...
- iOS开发之多线程技术—GCD篇
本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...
- iOS多线程 NSThread/GCD/NSOperationQueue
无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...
- [iOS]多线程和GCD
新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...
- iOS 多线程 之 GCD(大中枢派发)(一)
导语: 本文个人原创,转载请注明出处(http://www.cnblogs.com/pretty-guy/p/8126981.html) 在iOS开发中多线程操作通常是一下3种,本文着重介绍Dispa ...
- IOS多线程(GCD)
简介 Grand Central Dispatch 简称(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 ...
随机推荐
- 02快速学习ExtJs之---第一个HelloWord!
这篇主要讲部署下ExtJS开发环境,以及搭建项目.我们使用ExtJs官方提供的Sencha Cmd来搭建 1.搭建项目 1.下载官方的Sencha Cmd工具,安装. 2..Window用户进入到命令 ...
- Redis 读后小感
经过一个多月的业余时间,终于把 Redis 完整的撸了一遍,感谢峰哥推荐的书<Redis 设计与实现>,也谢谢作者把 Redis 解析的这么通俗易懂. 去年 10 月末入职的某厂是 Red ...
- 数据源和JNDI的关系:
DataSource对象是由Tomcat提供的,因此不能在程序中采用创建一个实例的方式来生产DataSource对象,而需要采用Java的另一个技术JNDI,来获得DataSource对象的引用. T ...
- HDU HDU1558 Segment set(并查集+判断线段相交)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1558 解题报告:首先如果两条线段有交点的话,这两条线段在一个集合内,如果a跟b在一个集合内,b跟c在一 ...
- css设置input中placeholder字体
设置input中placeholder字体颜色 input::-webkit-input-placeholder {color:@a;} input:-moz-placeholder {color:@ ...
- Android之Toast通知的几种自定义用法
Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); } ...
- Windows 2008R2关闭网络发现
在Windows Server 2008 R2安装完后,默认情况下,在高级共享设置中无法对网络发现的更改进行保存(每次选择"启用网络发现"后保存修改,但重新打开"高级共享 ...
- django xadmin 插件(2) 列表视图新增一功能列
以默认的related_link为例(即最后一列). 源码:xadmin.plugins.relate.RelatedMenuPlugin class RelateMenuPlugin(BaseAdm ...
- CSS position relative absolute fixed
position属性absolute与relative 详解 最近一直在研究javascript脚本,熟悉DOM中CSS样式的各种定位属性,以前对这个属性不太了解,从网上找到两篇文章感觉讲得很透彻 ...
- oracle数据库高级应用之《触发器的建立》
(一)oracle数据库触发器的建立 eg1 CREATE OR REPLACE TRIGGER TRIGGER_ON_TD_DEPARTMENT AFTER INSERT OR UPDATE OR ...