标签:
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