1. #define global_queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
  2. #define main_queue dispatch_get_main_queue()
  3.  
  4. #import "HMViewController.h"
  5.  
  6. @interface HMViewController ()
  7. @property (weak, nonatomic) IBOutlet UIImageView *imageView1;
  8. @property (weak, nonatomic) IBOutlet UIImageView *imageView2;
  9. @property (weak, nonatomic) IBOutlet UIImageView *bigImageView;
  10. @end
  11.  
  12. @implementation HMViewController
  13.  
  14. - (void)viewDidLoad
  15. {
  16. [super viewDidLoad];
  17. // Do any additional setup after loading the view, typically from a nib.
  18.  
  19. // 图片1: http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg
  20. // 图片2: http://news.baidu.com/z/resource/r/image/2014-06-22/b2a9cfc88b7a56cfa59b8d09208fa1fb.jpg
  21. /**
  22. 1.下载图片1和图片2
  23.  
  24. 2.将图片1和图片2合并成一张图片后显示到imageView上
  25.  
  26. 思考:
  27. * 下载图片 : 子线程
  28. * 等2张图片都下载完毕后, 才回到主线程
  29. */
  30. }
  31.  
  32. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  33. {
  34. // 创建一个组
  35. dispatch_group_t group = dispatch_group_create();
  36.  
  37. // 开启一个任务下载图片1
  38. __block UIImage *image1 = nil;
  39. dispatch_group_async(group, global_queue, ^{
  40. image1 = [self imageWithURL:@"http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg"];
  41. });
  42.  
  43. // 开启一个任务下载图片2
  44. __block UIImage *image2 = nil;
  45. dispatch_group_async(group, global_queue, ^{
  46. image2 = [self imageWithURL:@"http://news.baidu.com/z/resource/r/image/2014-06-22/b2a9cfc88b7a56cfa59b8d09208fa1fb.jpg"];
  47. });
  48.  
  49. // 同时执行下载图片1\下载图片2操作
  50.  
  51. // 等group中的所有任务都执行完毕, 再回到主线程执行其他操作
  52. dispatch_group_notify(group, main_queue, ^{
  53. self.imageView1.image = image1;
  54. self.imageView2.image = image2;
  55.  
  56. // 合并
  57. UIGraphicsBeginImageContextWithOptions(CGSizeMake(, ), NO, 0.0);
  58. [image1 drawInRect:CGRectMake(, , , )];
  59. [image2 drawInRect:CGRectMake(, , , )];
  60. self.bigImageView.image = UIGraphicsGetImageFromCurrentImageContext();
  61. // 关闭上下文
  62. UIGraphicsEndImageContext();
  63. });
  64. // if (self.log == NO) {
  65. // NSLog(@"-------touchesBegan");
  66. // self.log = YES;
  67. // }
  68. // static dispatch_once_t onceToken;
  69. // dispatch_once(&onceToken, ^{
  70. // NSLog(@"-------touchesBegan");
  71. // });
  72. }
  73.  
  74. - (void)downlaod2image
  75. {
  76. dispatch_async(global_queue, ^{
  77. NSLog(@"下载图片---%@", [NSThread currentThread]);
  78.  
  79. // 下载图片1
  80. UIImage *image1 = [self imageWithURL:@"http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg"];
  81. NSLog(@"下载完图片1---%@", [NSThread currentThread]);
  82. // 下载图片2
  83. UIImage *image2 = [self imageWithURL:@"http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg"];
  84. NSLog(@"下载完图片2---%@", [NSThread currentThread]);
  85.  
  86. dispatch_async(main_queue, ^{
  87. NSLog(@"显示图片---%@", [NSThread currentThread]);
  88.  
  89. self.imageView1.image = image1;
  90. self.imageView2.image = image2;
  91.  
  92. // 合并
  93. UIGraphicsBeginImageContextWithOptions(CGSizeMake(, ), NO, 0.0);
  94. [image1 drawInRect:CGRectMake(, , , )];
  95. [image2 drawInRect:CGRectMake(, , , )];
  96. self.bigImageView.image = UIGraphicsGetImageFromCurrentImageContext();
  97. // 关闭上下文
  98. UIGraphicsEndImageContext();
  99. });
  100. });
  101. }
  102.  
  103. - (UIImage *)imageWithURL:(NSString *)urlStr
  104. {
  105. NSURL *url = [NSURL URLWithString:urlStr];
  106. NSData *data = [NSData dataWithContentsOfURL:url]; // 这行会比较耗时
  107. return [UIImage imageWithData:data];
  108. }
  109.  
  110. - (void)delay
  111. {
  112. // NSLog(@"----touchesBegan----%@", [NSThread currentThread]);
  113.  
  114. // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  115. // [self performSelector:@selector(run) withObject:nil afterDelay:2.0];
  116. // });
  117. // 1.全局并发队列
  118. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
  119.  
  120. // 2.计算任务执行的时间
  121. dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
  122.  
  123. // 3.会在when这个时间点, 执行queue中的任务
  124. dispatch_after(when, queue, ^{
  125. NSLog(@"----run----%@", [NSThread currentThread]);
  126. });
  127. }
  128. //- (void)run
  129. //{
  130. // NSLog(@"----run----%@", [NSThread currentThread]);
  131. //}
  132.  
  133. @end

IOS GCD03-其他用法的更多相关文章

  1. IOS NSUserDefaults 讲解 用法

    IOS NSUserDefaults 讲解 用法    NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults ...

  2. ios Block详细用法

    ios Block详细用法 ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的 ...

  3. 【转】IOS NSTimer 定时器用法总结

    原文网址:http://my.oschina.net/u/2340880/blog/398598 NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题 ...

  4. iOS block的用法

    本章学习目标: 1. 了解何谓block. 2. 了解block的使用方法. Block 是iOS在4.0之后新增的程式语法,严格来说block的概念并不算是基础程式设计的范围,对初学者来说也不是很容 ...

  5. IOS NSTimer 定时器用法总结

    NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一.初始化方法:有五种初始化方法,分别是 + (NSTimer *)ti ...

  6. iOS block的用法 by -- 周傅琦君

    X.1 初探Block X.1.1 宣告和使用Block 我们使用「^」运算子来宣告一个block变数,而且在block的定义最后面要加上「;」来表示一个完整的述句(也就是将整个block定义视为前面 ...

  7. iOS UIApplication sharedapplication用法

    应用中打开其他应用 我们来讨论一下,在iOS开发中,如何实现从app1打开app2. 基本的思路就是,可以为app2定义一个URL,在app1中通过打开这个URL来打开app2,在此过程中,可以传送一 ...

  8. iOS自动布局进阶用法

    本文主要介绍几个我遇到并总结的相对高级的用法(当然啦牛人会觉得这也不算什么). 简单的storyboard中上下左右约束,固定宽高啥的用法在这里就不做赘述了. autolayout自动布局是iOS6以 ...

  9. 【转】iOS自动布局进阶用法

    原文网址:http://www.cnblogs.com/dsxniubility/p/4266581.html 本文主要介绍几个我遇到并总结的相对高级的用法(当然啦牛人会觉得这也不算什么). 简单的s ...

  10. IOS私人API用法

    先要使用class-dump 和dumpFrameworks.pl 工具 将ios的framework导出来. 下面是工具的下载地址: class-dump下载地址http://www.codethe ...

随机推荐

  1. restframework CBV试图的4种方式

    day100 上节回顾 1 APIView流程 2 序列化组件(restframework) 1 # 自定义序列化组件 class BookSerializers(serializers.Serial ...

  2. Appium——appium之mac环境安装

    一.安装brew:Homebrew是一款Mac OS平台下的软件包管理工具执行:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubuserco ...

  3. Linux字符设备驱动--Led设备驱动

    ①驱动源码 #include <linux/module.h> #include <linux/init.h> #include <linux/cdev.h> #i ...

  4. java web关于文件上传下载的总结

    文件上传使用<form method="POST"   enctype="multipart/form-data"> , 而不是默认的applica ...

  5. 2----scrapy框架之代理and日志级和请求传参

    一.代理 爬虫文件 daili.py class DailiSpider(scrapy.Spider): name = 'daili' #allowed_domains = ['www.xxx.com ...

  6. Linux添加、创建新用户

    给Linux添加新用户,新建用户,新建帐号 添加用户组 sudo groupadd groupname 添加用户 sudo useradd username -m -s /bin/bash -d /h ...

  7. javascript 例外处理Try{}catch(e){}

    程序开发中,编程人员经常要面对的是如何编写代码来响应错误事件的发生,即例外处理(exception handlers).如果例外处理代码设计得周全,那么最终呈现给用户的就将是一个友好的界面.否则,就会 ...

  8. inventor安装失败怎样卸载安装inventor 2014?

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  9. Murano Weekly Meeting 2016.06.28

    Meeting time: 2016.June.28 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: 1. ...

  10. winscp介绍与使用

    winscp介绍 WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端.同时支持 SCP 协议.它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑 ...