iOS开发—使用GCD下载图片

通过一个下载网络图片的案例,展示使用GCD来完成多线程的管理,当图片下载完成后,将图片显示到主线程更新UI,具体步骤如下:

1、新建一个Single View Application 应用,名称为06-GCDDownload;

2、进入Main.StoryBoard,从对象库拖拽一个ImageView到程序界面,用于放置下载后的图片,给Image View设置一个背景颜色,设计好的界面如下:


3、通过拖拽的方式,将ImageView在viewController.m文件的类扩展中进行属性的声明;

4、单击模拟器的屏幕,通过异步的方式开启子线程来下载图片,当图片从网络上下载完成后,回到主线程将下载完成的图片显示到ImageView上,代码如下:

//获取全局并发队列和主队列的宏定义
#define globalQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
#define mainQueue dispatch_get_main_queue()
#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{   //通过一个异步执行的全局并发队列,开启了一个子线程进行图片下载
    dispatch_async(globalQueue,^{
        NSLog(@"download---%@",[NSThread currentThread]);
    //子线程下载图片
        NSURL *url=[NSURL URLWithString:
                    @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1510256650274&di=d41d8cd98f00b204e9800998ecf8427e&imgtype=0&src=http%3A%2F%2Fa3.topitme.com%2F0%2Fb5%2F0e%2F1106687894f7e0eb50o.jpg"];
        NSData *data=[NSData dataWithContentsOfURL:url];
    //将网络数据初始化为UIImage对象
        UIImage *image=[UIImage imageWithData:data];
        if(image!=nil){
        //回到主线程设置图片,更新UI界面
            dispatch_async(mainQueue,^{
                NSLog(@"setting---%@%@",[NSThread currentThread],image);
                self.imageView.image=image;
            });
        }
        else{
            NSLog(@"图片下载出现错误");
        }
    });
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

程序运行成功后,单击模拟器屏幕,下载完成的页面如下图:


注意:为了获取主线程,GCD提供了一个特殊的Dispatch Queue队列,可以在应用的主线程中执行任务,只要应用主线程设置了Run Loop,就会自动创建这个队列,并且最后会自动销毁。对于非Cocoa应用而言,如果没有显式地设置Run Loop,就必须显式地调用dispatch_get_main_queue()函数来激活这个队列。否则,虽然可以添加任务到队列,但任务永远不会被执行。

调用dispatch_get_main_queue()函数可获得应用主线程的Dispatch Queue,添加到这个队列的任务由主线程串行执行。

猜你喜欢

转载自blog.csdn.net/shichunxue/article/details/78495630