美文网首页
关于GCD常用的方法

关于GCD常用的方法

作者: 我是世界微小的存在 | 来源:发表于2017-02-23 14:55 被阅读0次

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常用的方法

    iOS开发多线程篇—GCD的常见用法 一、延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)...

  • GCD常用方法

  • GCD常用方法

    本文主要介绍GCD一些API的使用,也就是注重实站! 一、GCD常用API1.并发队列2.串行队列3.设置自定义队...

  • GCD常用方法

    1、延迟做某些任务 2、多个任务同时进行,等任务全部完成之后去进行下一步操作。例如:下面的为网络刷新数据, 但是刷...

  • GCD 常用方法

    1. dispatch_async 异步添加到队列 Demo: 2. dispatch_after 延后添加到队列...

  • GCD常用方法

    //1、创建主线程(串行) dispatch_async(dispatch_get_main_queue(), ^...

  • GCD常用方法

    1.创建异步线程 2.创建同步线程 3.创建主线程 4.GCD只执行一次 5.线程延迟调用 6.信号量 dispa...

  • GCD常用方法

    执行一次代码 延迟执行 主线程睡眠3秒,该方法不推荐,因为会阻塞主线程,影响用户体验 该方法在哪个线程中调用则延迟...

  • GCD常用方法

    一次性代码 整个程序运行过程中只会执行一次。本身是线程安全的,可以用于实现单例模式。 内部实现原理:判断onceT...

  • GCD的常用方法

    1、barrier方法2、延迟执行的常用方法3、一次性执行代码4、快速迭代5、队列组 1、barrier方法,注意...

网友评论

      本文标题:关于GCD常用的方法

      本文链接:https://www.haomeiwen.com/subject/jclbwttx.html