2. GCD的使用(线程间通信---子线程执行耗时操作/主线程更新UI)

//
//  ViewController.m
//  07-线程间通信(加载图片,在主线程中更新UI)
//
//  Created by Jasperay on 15/9/3.
//  Copyright (c) 2015年 @aLonelyRoot3. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIButton *button;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
}


// 加载网络图片的方法
- (UIImage *)loadImageWithUrl:(NSString *)urlStr {

//  URL: 同一资源定位符.定位唯一资源
    
    NSURL *url = [NSURL URLWithString:urlStr];
    
    NSData *data = [NSData dataWithContentsOfURL:url];
    
    UIImage *img = [UIImage imageWithData:data];
    
    return img;
}


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

//  1.在子线程下载图片
    
//  首先, 需要开启新的线程, 需要使用异步函数
    
//  然后, 并发任务都可以放在全局并发队列, 而UI操作放在主队列
    
    
//  因此可以使用(异步函数 + 全局并发队列) 内部嵌套 一个(异步函数 + 主队列)的形式-----常用
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSString *urlStr = @"http://img1a.xgo-img.com.cn/pics/1538/a1537491.jpg";
        UIImage *img = [self loadImageWithUrl:urlStr];
        

//  2.在主线程更新UI
//      此时回到主线程,更新UI(给button设置背景图)
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.button setBackgroundImage:img forState:UIControlStateNormal];
        });
    });

}


@end

 

posted on 2015-09-03 15:43  aLonelyRoot3  阅读(383)  评论(0编辑  收藏  举报

导航