ios多线程GCD group

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

ios多线程GCD group的相关文章

iOS多线程 GCD

iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. *

iOS多线程GCD

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. * * @discussi

深入IOS多线程 GCD(一)

一,什么是GCD GCD是异步执行任务的技术之一,一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的dispatch queue中,GCD就能生成必要的线程并计划执行任务.由于线程管理师作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率. 也就是说GCD用我们难以置信的非常简单的记述方法,实现了极为复杂的多线程编程,可以说这是一项划时代的技术.下面是使用了GCD源码的例子,虽然稍微抽象,但从中也能感受到GCD的威力 d

IOS 多线程GCD的使用[转载于新浪微博, 原作者:太阳石]

原文 在红黑联盟上看到一篇关于多线程GCD的教程文章,写的深入浅出,特转载于此,以备不时之需.原文链接另:补充两个GCD代码,都是Xcode snippet里面提供的:1.Dispatch After主要用于延迟执行一些代码.例子: int64_t delayInSeconds = 1.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_aft

iOS 多线程 GCD part3:API

https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 #define NSEC_PER_SEC 1000000000ull #define NSEC_PER_MSEC 1000000ull #define USEC_PER_SEC 1000000ull #define NSEC_PER_USEC 1000ull MSEC:毫秒 USEC:微秒 NSE

iOS 多线程GCD的基本使用

<iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 /** * 异步函数 + 并发队列:可以同时开启多条线程 */ - (void)asyncConcurrent { // 1.创建一个并发队列 // dispatch_queue_create(const char *label, dispatch_queue_attr_t attr); // label

iOS多线程——GCD篇

什么是GCD GCD是苹果对多线程编程做的一套新的抽象基于C语言层的API,结合Block简化了多线程的操作,使得我们对线程操作能够更加的安全高效. 在GCD出现之前Cocoa框架提供了NSObject类的 performSelectorInBackground:withObject performSelectorOnMainThread 方法来简化多线程编程技术. GCD可以解决以下多线程编程中经常出现的问题:1.数据竞争(比如同时更新一个内存地址) 2.死锁(互相等待) 3.太多线程导致消耗

iOS多线程GCD的简单使用

在iOS开发中,苹果提供了三种多线程技术,分别是: (1)NSThread (2)NSOperation (3)GCD 简单介绍一下GCD的使用. GCD全称 Grand Central Dispatch,可以称之为大中央调度.实际上GCD是管理着一个线程池,如何创建线程,如何回收线程,以及分配多少个线程,这些都是GCD来控制的.在开发中,程序员是不用操作线程的相关事情,程序员只需要把应该做的操作放到相应的队列里面即可. 一:自定义队列 GCD中有多种队列,其中自定义的队列有两种:串行队列和并行

iOS多线程GCD详解

今天我们在这里了解一下GCD 1.什么是GCD? GCD全称Grand Central Dispatch,我们通俗的翻译叫牛逼的中心调度. 2.我们用GCD干什么? 通过 GCD,开发者不用再直接跟线程打交道了,只需要向队列中添加代码块即可,GCD 在后端管理着一个线程池.GCD 不仅决定着你的代码块将在哪个线程被执行,它还根据可用的系统资源对这些线程进行管理.这样可以将开发者从线程管理的工作中解放出来,通过集中的管理线程,来缓解大量线程被创建的问题. GCD 带来的另一个重要改变是,作为开发者