线程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命令的参数 ...
随机推荐
- C++派生类与基类对象赋值情况
一 .普通赋值 (同名隐藏) 子类对象调用和父类相同的函数名,该父类的函数名会被隐藏,只会调用子类的函数. Class A { public: void show(); void show(int); ...
- Console命令,让js调试更简单
一.显示信息的命令 console.log("normal"); // 用于输出普通信息 console.info("information"); // 用于输 ...
- JS弹出对话框函数alert(),confirm(),prompt()
1,警告消息框alert() alert 方法有一个参数,即希望对用户显示的文本字符串.该字符串不是 HTML 格式.该消息框提供了一个“确定”按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是 ...
- CSS3的三大特性
在学习CSS 的时候,我们必须要熟练和理解CSS 的三大特性,那么CSS 的三大特性又是什么呢? CSS 的三大特性:层叠 继承 优先级 ,CSS 三大特性是我们学习CSS 必须掌握的三个特性. 首 ...
- Python小白学习之路(二十)—【打开文件的模式二】【文件的其他操作】
打开文件的模式(二) 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码.图片文件的jgp格 ...
- LeetCode题解-23 合并K个排序链表 Hard
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1-&g ...
- VS2013创建Windows服务与调试服务
1.创建Windows服务 说明: a)Description 服务描述,直接显示到Windows服务列表中的描述: b)DisplayName 服务显示名称,直接显示到Windows服务列表中的名称 ...
- PHP查找与搜索数组元素
in_array()函数 in_array()函数在一个数组汇总搜索一个特定值,如果找到这个值返回true,否则返回false.其形式如下: boolean in_array(mixed needle ...
- Sublime Text 3编辑器的SublimeRPEL快捷键设置
Sublime Text 3软件由于每次运行程序都要执行:Tools -> SublimeREPL -> Python -> RUN current file 菜单有点麻烦,所以现在 ...
- Android 开发服务类 01_ServletForXML
Servlet implementation class NewsListServlet package com.wangjialin.server.xml; import java.io.IOExc ...