标签:
NSThread是轻量级的多线程开发,使用它需要我们自己管理线程的生命周期。
有两种方法创建启动线程。
方法1:对象方法 -(instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
方法2:类方法 +(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
废话不多说,下面写一个多线程下载图片的小程序用来测试这两个方法。
新建一个iOS single view application,点开Main.storyboard,在右边的object library中拖出一个UIImageView控件和一个UIButton控件到当前view中,调整其大小,可以适当设置UIButton的背景图。界面大致如下图所示:
接着拖线,将UIImageView控件与一个属性关联,UIbutton与一个名为download的方法关联。点击按钮,就执行download方法,并下载一张图片,将其显示在UIImageView控件中。下面是源码。
#import "ViewController.h"
@interface ViewController ()
- (IBAction)download;
-(void)updateImage:(NSData*)imgData;
-(NSData*)requestData;
-(void)loadImage;
@property (weak, nonatomic) IBOutlet UIImageView *imgView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
//将图片显示到界面
-(void)updateImage:(NSData *)imgData
{
UIImage* img = [UIImage imageWithData:imgData];
_imgView.image = img;
}
//请求图片数据
-(NSData*)requestData
{
NSURL* url = [NSURL URLWithString:@"http://c.hiphotos.baidu.com/image/h%3D300/sign=37b7744b85cb39dbdec06156e01709a7/2f738bd4b31c87014bf8a247237f9e2f0608ffc1.jpg"];
NSData* data = [NSData dataWithContentsOfURL:url];
return data;
}
//加载图片
-(void)loadImage
{
//请求数据
NSData* data = [self requestData];
//将数据显示在UIImageView上,注意只能在主线程中更新UI
[self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES];
}
//使用类方法,多线程下载图片
- (IBAction)download {
//1. 使用类方法
// [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
//2. 使用对象方法
NSThread* thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadImage) object:nil];
[thread start];
}
@end
程序运行起来,点击“下载”按钮“,结果如下:
要注意的是,更改UI界面需要在主线程中(也成为UI线程),所以在loadImage方法中是这样更新UIImageView的图片的:
[self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES];
最后,由于我们使用的是多线程下载图片,所以点击下载按钮之后,不管图片有没有下载完成,都不会影响其他操作,不会造成阻塞。
标签:
原文地址:http://www.cnblogs.com/czymelon/p/5084973.html