线程8--GCD常见用法
1.延迟执行
/***********************延迟第一种方法**************************/
/* 第一种方法,
调用NSObject的方法
[self performSelector:@selector(run) withObject:nil afterDelay:2.0];
@1.该方法在那个线程调用,那么run就在哪个线程执行(当前线程),通常是主线程。
@2.如果把该方法放在异步函数中执行,则方法不会被调用 */
//第一种方法:延迟3秒钟调用run函数
/*
NSLog(@"打印线程----%@",[NSThread currentThread]);
[self performSelector:@selector(run) withObject:nil afterDelay:2.0];
*/
/**********************延迟第二种方法**********************/ /****************主队列***************/
//可以安排其线程(1),主队列
dispatch_queue_t queue=dispatch_get_main_queue();
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0*NSEC_PER_SEC)), queue, ^{
NSLog(@"主队列--延迟执行----%@",[NSThread currentThread]);
});
/****************并发队列***************/
//可以安排其线程(2),并发队列
//1.获取全局并发队列
dispatch_queue_t queue1=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
//2.计算任务执行的时间
dispatch_time_t when=dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
//3.会在when这个时间点,执行queue中的这个任务
dispatch_after(when, queue1, ^{
NSLog(@"并发队列-延迟执行----%@",[NSThread currentThread]);
});
2.一次性代码
/**************************方法1*************************/
//缺点:这是一个对象方法,如果又创建一个新的控制器,那么打印代码又会执行,因为每个新创建的控制器都有自己的布尔类型,且新创建的默认为NO,因此不能保证改行代码在整个程序中只打印一次。
if (_log==NO) {
NSLog(@"方法1一次性代码");
_log=YES;
}
/***************************方法2**************************/
//使用dispatch_once函数能保证某段代码在程序运行过程中只被执行1次
//整个程序运行过程中,只会执行一次。
static dispatch_once_t once;
dispatch_once(&once,^{
NSLog(@"方法2一次性代码");// 只执行1次的代码(这里面默认是线程安全的)
});
3.队列组
/*************************队列组**************************/
/*
提示:使用队列组可以让图片1和图片2的下载任务同时进行,且当两个下载任务都完成的时候回到主线程进行显示。 2.使用队列组解决
步骤:
2.1创建一个组
2.2开启一个任务下载图片1
2.3开启一个任务下载图片2
2.4同时执行下载图片1\下载图片2操作
2.5等group中的所有任务都执行完毕, 再回到主线程执行其他操作
*/
NSLog(@"队列表开始下载");
dispatch_group_t group=dispatch_group_create();
/******************************************/
//执行1个耗时的异步操作
__block UIImage *image1=nil; dispatch_group_async(group,global_quque, ^{
NSLog(@"图片1开始下载");
image1=[self imageWithURL:@"http://a583.phobos.apple.com/us/r30/Purple4/v4/02/23/ec/0223ec03-ed8e-1c92-26c0-7dec34de6667/mzl.ksnlsaoo.175x175-75.png"]; NSLog(@"图片1下载完成--%@",[NSThread currentThread]);
});
/*******************************************/
//执行1个耗时的异步操作
__block UIImage *image2=nil;
dispatch_group_async(group, global_quque, ^{
NSLog(@"图片2开始下载");
image2=[self imageWithURL:@"http://img3.imgtn.bdimg.com/it/u=1790102556,3036052735&fm=21&gp=0.jpg"];
NSLog(@"图片2下载完成--%@",[NSThread currentThread]); });
/********************************************/
// 等前面的异步操作都执行完毕后,回到主线程...
dispatch_group_notify(group, main_queue, ^{
self.imageView1.image=image1;
self.imageView2.image=image2;
UIGraphicsBeginImageContextWithOptions(CGSizeMake(, ), NO, );
[image1 drawInRect:CGRectMake(, , , )];
[image2 drawInRect:CGRectMake(, , , )];
self.imageView3.image=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSLog(@"图片合并完成%@",[NSThread currentThread]);
});
/**************************************************************/
-(UIImage*)imageWithURL:(NSString*)urlstr{
NSURL *url=[NSURL URLWithString:urlstr];
NSData *data=[NSData dataWithContentsOfURL:url];
UIImage *image=[UIImage imageWithData:data];
return image;
}
线程8--GCD常见用法的更多相关文章
- iOS多线程 GCD常见用法
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispat ...
- iOS 开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- iOS开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- iOS开发多线程篇 08 —GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- GCD的用法
单例的实现 + (BindingRedResourceWIndow *)sharedInstance { static id sharedInstance = nil; static dispatch ...
- python中os模块和sys模块的常见用法
OS模块的常见用法 os.remove() 删除文件 os.rename() 重命名文件 os.walk() 生成目录树下的所有文件名 os.chdir() 改变目录 os.mkd ...
- 第二节:框架前期准备篇之AutoFac常见用法总结
一. 说在前面的话 凡是大约工作在两年以上的朋友们,或多或少都会接触到一些框架搭建方面的知识,只要一谈到框架搭建这个问题或者最佳用法这个问题,势必会引起一点点小小的风波,我说我的好,他说他的好,非常容 ...
- 转载 AutoFac常见用法总结
第二节:框架前期准备篇之AutoFac常见用法总结 一. 说在前面的话 凡是大约工作在两年以上的朋友们,或多或少都会接触到一些框架搭建方面的知识,只要一谈到框架搭建这个问题或者最佳用法这个问题,势 ...
- 框架前期准备篇之AutoFac常见用法总结 转载
框架前期准备篇之AutoFac常见用法总结 一. 说在前面的话 凡是大约工作在两年以上的朋友们,或多或少都会接触到一些框架搭建方面的知识,只要一谈到框架搭建这个问题或者最佳用法这个问题,势必会引起一点 ...
- Linux中find常见用法
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...
随机推荐
- 如何做好iOS应用安全?这有一把行之有效的“三板斧”
本文由 网易云发布. iOS应用面临很多破解问题,常见的有IAP内购破解.山寨版本.破解版本等:大众应用上,微信抢红包.微信多开等:而在iOS游戏上,越来越泛滥的外挂问题也不断困扰着游戏厂商. 网易 ...
- 实现liunx之间无密码访问——ssh密匙
环境描述 两台linux服务器 172.16.1.22[client],172.16.1.33[server],想要实现client服务器ssh无密码访问server服务器. 使用技术 linux 的 ...
- flume在windows环境下的使用
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理, ...
- C博客作业03—函数
1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1 学习体会 知道了程序的模块化设计可使程序结构清晰,简化复杂问题,解决代码重复问题 学会使用自定义函数简化主函数,使代码 ...
- day52 进程与守护进程
http://www.cnblogs.com/Eva-J/articles/8253549.html 博客参考. 多进程聊天 守护进程. 多进程 1.Unix/Linux:fork()调用实现多进程. ...
- BZOJ 1003--[ZJOI2006]物流运输(最短路)
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 10034 Solved: 4403 Description ...
- python os.path 的使用
import os #该文件所在位置:D:\第1层\第2层\第3层\第4层\第5层\test11.py path1 = os.path.dirname(__file__) print(path1)#获 ...
- UINavigationBar 的视觉效果
有很多属性可以决定导航栏的视觉效果,下面做一下总结 barStyle 属性 白底黑字 default 黑底白字 black blackOpaque 和 blackTranslucent 已被 Depr ...
- R软件常用命令
1.getwd() 获取默认的目录 2.> mydata <- read.csv("1.csv") 读取1.csv文件中的数据,并赋值给一个mydata的对 ...
- EF基础知识小记七(拆分实体到多个表以及拆分表到多个实体)
一.拆分实体到多个表 1.在日常开发中,会经常碰到一些老系统,当客户提出一些新的需求,这些需求需要在原来的表的基础上加一些字段,大多数人会选择通过给原表添加字段的方式来完成这些需求,方法,虽然可行,但 ...