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常见用法的更多相关文章

  1. iOS多线程 GCD常见用法

    Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispat ...

  2. iOS 开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  3. iOS开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  4. iOS开发多线程篇 08 —GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  5. GCD的用法

    单例的实现 + (BindingRedResourceWIndow *)sharedInstance { static id sharedInstance = nil; static dispatch ...

  6. python中os模块和sys模块的常见用法

    OS模块的常见用法 os.remove()   删除文件 os.rename()   重命名文件 os.walk()    生成目录树下的所有文件名 os.chdir()    改变目录 os.mkd ...

  7. 第二节:框架前期准备篇之AutoFac常见用法总结

    一. 说在前面的话 凡是大约工作在两年以上的朋友们,或多或少都会接触到一些框架搭建方面的知识,只要一谈到框架搭建这个问题或者最佳用法这个问题,势必会引起一点点小小的风波,我说我的好,他说他的好,非常容 ...

  8. 转载 AutoFac常见用法总结

    第二节:框架前期准备篇之AutoFac常见用法总结   一. 说在前面的话 凡是大约工作在两年以上的朋友们,或多或少都会接触到一些框架搭建方面的知识,只要一谈到框架搭建这个问题或者最佳用法这个问题,势 ...

  9. 框架前期准备篇之AutoFac常见用法总结 转载

    框架前期准备篇之AutoFac常见用法总结 一. 说在前面的话 凡是大约工作在两年以上的朋友们,或多或少都会接触到一些框架搭建方面的知识,只要一谈到框架搭建这个问题或者最佳用法这个问题,势必会引起一点 ...

  10. Linux中find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

随机推荐

  1. Mac OS 10.12 - 如何关闭Rootless机制?

    一,进入恢复模式(Recovery):具体操作方法参见下面这篇博客: http://www.cnblogs.com/sunylat/p/6414697.html 二,关闭Rootless机制 1,选择 ...

  2. Mac 忘记密码

    今天早上到公司发现电脑被动过,马上查看浏览器的历史记录,果然发现了一些痕迹.虽然是公司的电脑,但是随便被人翻看,还是很不爽! 于是马上把原来公司给的默认密码改掉. 不料,中午出去吃了个饭,回来就把密码 ...

  3. MySQL(动态执行SQL)

    day61 防sql注入 delimiter \\ CREATE PROCEDURE p4 ( ), in arg int ) BEGIN set @xo = arg; PREPARE xxx FRO ...

  4. java中使用OpenOffice

    1. 下载软件/傻瓜安装 OpenOffice 下载地址http://www.openoffice.org/ JodConverter 下载地址http://sourceforge.net/proje ...

  5. Mybatis常用知识点总结

    1. #{}和${}的区别是什么? ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc ...

  6. eclispe中使用python库 pyswip 进行prolog编程

    from pyswip import Prolog prolog = Prolog() prolog.assertz("father(michael,john)") prolog. ...

  7. yolov3源码分析keras(一)数据的处理

    一.前言 本次分析的源码为大佬复现的keras版本,上一波地址:https://github.com/qqwweee/keras-yolo3 初步打算重点分析两部分,第一部分为数据,即分析图像如何做等 ...

  8. Ejb3 + Jboss8 出现Session id hasn't been set for stateful component

    Ejb 3 + JBoss 8  在使用客户端远程访问有状态的Ejb对象时,出现ERROR: Session id hasn't been set for stateful component 出现该 ...

  9. 2018春招-今日头条笔试题-第四题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) #-*- coding:utf-8 -*- class Magic: ''' a:用于存储数组a b:用于存储数组b num:用于 ...

  10. ActiveMQ--HelloWorld

    下载windows版本ActiveMQ,apache-activemq-5.15.3\bin\win64\activemq.bat 启动mq,ActiveMQ内置jetty,默认端口8161,默认用户 ...