您的位置:首页 > 理论基础 > 计算机网络

网络开始---多线程---线程间的通信(掌握)(五)

2015-09-18 01:10 597 查看


#import "HMViewController.h"

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

@implementation HMViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

//点击下载图片  下载图片是耗时操作,放到子线程中执行 创建一个新的线程执行下载图片
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//创建线程
[self performSelectorInBackground:@selector(download) withObject:nil];
}

/**
*  下载图片
*/
- (void)download
{

NSLog(@"download---%@", [NSThread currentThread]);

// 1.要下载的图片地址url
NSString *urlStr = @"http://d.hiphotos.baidu.com/image/pic/item/37d3d539b6003af3290eaf5d362ac65c1038b652.jpg";

NSURL *url = [NSURL URLWithString:urlStr];

// 2.根据地址下载图片的二进制数据(这句代码最耗时)
NSLog(@"---begin");  //二进制数据
NSData *data = [NSData dataWithContentsOfURL:url];
NSLog(@"---end");

// 3.设置图片 用二进制数据设置图片
UIImage *image = [UIImage imageWithData:data];

//在子线程中下载图片,下载完成后要回到主线程去修改UI界面,牵扯到主线程与子线程之间的来回穿梭
// 4.回到主线程,刷新UI界面(为了线程安全)  就是把图片放上去
[self performSelectorOnMainThread:@selector(downloadFinished:) withObject:image waitUntilDone:NO];
//后面的YES是指回到主线程设置图片,代码在这里一直等待,等到图片设置好再往下执行
//NO则表示回到主线程设置图片,代码继续往下执行,不管图片有没有设置好

//可以给任意线程传东西,线程间的通信 object就是你要传的对象,就是你想要设置的东西
//    [self performSelector:@selector(downloadFinished:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];

//和主线程通信,设置UI界面图片
//    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

NSLog(@"-----done----");
}

/**
*  设置这个图片是在主线程中执行的
*
*  @param image <#image description#>
*/
- (void)downloadFinished:(UIImage *)image
{
self.imageView.image = image;

NSLog(@"downloadFinished---%@", [NSThread currentThread]);
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: