IOS多线程-NSThread简单使用

NSThread是轻量级的多线程开发,使用起来也并不复杂,但是使用NSThread需要自己管理线程生命周期。

可以使用对象方法

+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument直接将操作添加到线程中并启动,

也可以使用对象方法

- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument创建一个线程对象,然后调用start方法启动线程。

解决线程阻塞问题

在资源下载过程中,由于网络原因有时候很难保证下载时间,如果不使用多线程可能用户完成一个下载操作需要长时间的等待,这个过程中无法进行其他操作。下面演示一个采用多线程下载图片的过程,在这个示例中点击按钮会启动一个线程去下载图片,下载完成后使用UIImageView将图片显示到界面中。可以看到用户点击完下载按钮后,不管图片是否下载完成都可以继续操作界面,不会造成阻塞。

//
//  ViewController.m
//  NSThread测试
//
//  Created by aslan on 16/3/12.
//  Copyright © 2016年 aslan. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
{
    UIImageView * _imageView;
}

@end

@implementation ViewController

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

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark 界面布局
- (void)layoutUI
{
    _imageView = [[UIImageView alloc]initWithFrame:[UIScreen mainScreen].bounds];
    _imageView.contentMode = UIViewContentModeTop;
    [self.view addSubview:_imageView];
    
    UIButton * button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(50, 500, 220, 25);
    [button setTitle:@"加载图片" forState:UIControlStateNormal];
    
    //添加方法
    [button addTarget:self action:@selector(loadImageWithMultiThread) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    
}

#pragma mark 多线程下载图片
- (void)loadImageWithMultiThread
{
    //创建一个线程,第一个参数是请求操作,第二个参数是操作方法的参数
    NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(loadImage) object:nil];
    
    //启动一个线程
    [thread start];
    
}

#pragma mark 加载图片
-(void)loadImage
{
    //请求资源
    NSData * data = [self requestData];
    
    //将数据显示到UI控件,注意只能在主线程中更新UI
    
    [self performSelectorOnMainThread:@selector(updataImage:) withObject:data waitUntilDone:YES];
    
}

#pragma mark 图片显示到界面
- (void)updataImage:(NSData *)imageData
{
    UIImage * image = [UIImage imageWithData:imageData];
    _imageView.image = image;
}

#pragma mark 请求图片数据
- (NSData *)requestData
{
    NSURL * url = [NSURL URLWithString:@"http://img15.3lian.com/2016/h1/18/186.jpg"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    return data;
}
@end



你可能感兴趣的:(IOS多线程-NSThread简单使用)