关于GCD常用的方法

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

一、延迟执行

1.介绍    iOS常见的延时执行有2种方式

             (1)调用NSObject的方法

              [self performSelector:@selector(run) withObject:nil afterDelay:2.0];

                 // 2秒后再调用self的run方法

             (2)使用GCD函数

               dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

             // 2秒后异步执行这里的代码...

             });

2.使用dispatch_once一次性代码

 使用dispatch_once函数能保证某段代码在程序运行过程中只被执行1次

            static dispatch_once_t onceToken;

          dispatch_once(&onceToken, ^{

         // 只执行1次的代码(这里面默认是线程安全的)

       });

整个程序运行过程中,只会执行一次。

3.使用队列组解决     需求:从网络上下载两张图片,把两张图片合并成一张最终显示在view上。

步骤:

创建一个组

开启一个任务下载图片1

开启一个任务下载图片2

同时执行下载图片1\下载图片2操作

等group中的所有任务都执行完毕, 再回到主线程执行其他操作

//宏定义全局并发队列

#define global_quque    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

//宏定义主队列

#define main_queue      dispatch_get_main_queue()

@interface YYViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView1;

@property (weak, nonatomic) IBOutlet UIImageView *imageView2;

@property (weak, nonatomic) IBOutlet UIImageView *imageView3;

@end

@implementation YYViewController

- (void)viewDidLoad

{

[super viewDidLoad];

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

//    图片1:http://d.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=2b9a12172df5e0fefa1581533d095fcd/cefc1e178a82b9019115de3d738da9773912ef00.jpg

//    图片2:http://h.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=f47fd63ca41ea8d39e2f7c56f6635b2b/1e30e924b899a9018b8d3ab11f950a7b0308f5f9.jpg

//1.创建一个队列组

dispatch_group_t group = dispatch_group_create();

//2.开启一个任务下载图片1

__block UIImage *image1=nil;

dispatch_group_async(group, global_quque, ^{

image1= [self imageWithUrl:@"http://d.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=2b9a12172df5e0fefa1581533d095fcd/cefc1e178a82b9019115de3d738da9773912ef00.jpg"];

NSLog(@"图片1下载完成---%@",[NSThread currentThread]);

});

//3.开启一个任务下载图片2

__block UIImage *image2=nil;

dispatch_group_async(group, global_quque, ^{

image2= [self imageWithUrl:@"http://h.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=f47fd63ca41ea8d39e2f7c56f6635b2b/1e30e924b899a9018b8d3ab11f950a7b0308f5f9.jpg"];

NSLog(@"图片2下载完成---%@",[NSThread currentThread]);

});

//同时执行下载图片1\下载图片2操作

//4.等group中的所有任务都执行完毕, 再回到主线程执行其他操作

dispatch_group_notify(group,main_queue, ^{

NSLog(@"显示图片---%@",[NSThread currentThread]);

self.imageView1.image=image1;

self.imageView2.image=image2;

//合并两张图片

//注意最后一个参数是浮点数(0.0),不要写成0。

UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0);

[image1 drawInRect:CGRectMake(0, 0, 100, 100)];

[image2 drawInRect:CGRectMake(100, 0, 100, 100)];

self.imageView3.image=UIGraphicsGetImageFromCurrentImageContext();

//关闭上下文

UIGraphicsEndImageContext();

NSLog(@"图片合并完成---%@",[NSThread currentThread]);

});

}

-(void)download2image

{

//获取全局并发队列

//    dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//获取主队列

//    dispatch_queue_t queue= dispatch_get_main_queue();

dispatch_async(global_quque, ^{

//下载图片1

UIImage *image1= [self imageWithUrl:@"http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg"];

NSLog(@"图片1下载完成---%@",[NSThread currentThread]);

//下载图片2

UIImage *image2= [self imageWithUrl:@"http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg"];

NSLog(@"图片2下载完成---%@",[NSThread currentThread]);

//回到主线程显示图片

dispatch_async(main_queue, ^{

NSLog(@"显示图片---%@",[NSThread currentThread]);

self.imageView1.image=image1;

self.imageView2.image=image2;

//合并两张图片

UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0);

[image1 drawInRect:CGRectMake(0, 0, 100, 100)];

[image2 drawInRect:CGRectMake(0, 0, 100, 100)];

self.imageView3.image=UIGraphicsGetImageFromCurrentImageContext();

//关闭上下文

UIGraphicsEndImageContext();

NSLog(@"图片合并完成---%@",[NSThread currentThread]);

});

//

});

}

//封装一个方法,传入一个url参数,返回一张网络上下载的图片

-(UIImage *)imageWithUrl:(NSString *)urlStr

{

NSURL *url=[NSURL URLWithString:urlStr];

NSData *data=[NSData dataWithContentsOfURL:url];

UIImage *image=[UIImage imageWithData:data];

return image;

}

@end

你可能感兴趣的:(关于GCD常用的方法)