线程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命令的参数 ...
随机推荐
- JEECG(三) JEECG minidao如何封装自己的 多表联合查询 分页查询
JEECG确实是一款实实在在的促进生产力的工具好处我想看到此文章的人应该都有所体会了 言归正传 JEECG框架自带的查询确实很省事,但是多表联合查询 分页查询 是我们开发业务系统当中不可避免的这时框架 ...
- LinkedBlockingQueue源码解析(3)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 4.3.public E take() throws InterruptedException 原理: 将队 ...
- 简单的卷积神经网络(CNN)的搭建
卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现.与普通神经网络非常相 ...
- 二,windows下安装memcached服务
window下安装memcached服务的流程如下: 1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached 2. 在终端(也即cmd命令界面)下输入 ‘c ...
- Android多媒体整体架构图
Android多媒体整体架构图 MediaPlayer框架图 Camera框架图 SoundRecorder框架图 VideoCamera框架图 OpenCore与Skia ALSA Audio框架图 ...
- Jmeter Cannot load JDBC driver class 'com.mysql.jdbc.Driver'问题解决方案
1.下载 mysql-connector-java-5.1.44-bin.jar,哪个版本都可以,按自己的mysql版本来 2.将jar包放到jmeter安装路径下的 apache-jmeter-3. ...
- ReentrantReadWriteLock源码分析(一)
此处源码分析,主要是基于读锁,非公平机制,JDK1.8. 问题: 1.ReentrantReadWriteLock是如何创建读锁与写锁? 2.读锁与写锁的区别是什么? 3.锁的重入次数与获取锁的线程数 ...
- 【xsy1237】 字符转换 矩阵快速幂
题目大意:给你两个长度都为n,字符集为{a,b,c}的字符串S和T. 对于字符串S的任意一个字符,我们可以用cost[0]的代价,把字符a变成字符b.用cost[1]的代价,把字符b变成c,用cost ...
- linux内核模块的安全
linux可以动态的加载内核模块,在很多场合可能需要确保加载内核的安全性.如果被攻击者加载恶意内核模块,将会使得内核变得极其危险. 当然,稳妥的做法就是给内核模块进行签名,内核只加载能正确验证的签名. ...
- linux 可执行文件与写操作的同步问题
当一个可执行文件已经为write而open时,此时的可执行文件是不允许被执行的.反过来,一个文件正在执行时,它也是不允许同时被write模式而open的.这个约束很好理解,因为文件执行和文件被写应该需 ...