码迷,mamicode.com
首页 > 移动开发 > 详细

iOS多线程之NSThread

时间:2015-12-29 11:07:07      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

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];

最后,由于我们使用的是多线程下载图片,所以点击下载按钮之后,不管图片有没有下载完成,都不会影响其他操作,不会造成阻塞。

 

iOS多线程之NSThread

标签:

原文地址:http://www.cnblogs.com/czymelon/p/5084973.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!