IOS多线程--NSThread多线程并发

大家应该注意到不管是使用

+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument

- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument 方法

还是使用- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait方法都只能传一个参数,由于更新图片需要传递UIImageView的索引和图片数据,因此这里不妨定义一个类 (KCImageData) 保存图片索引和图片数据以供后面使用。

//
//  KCImageData.h
//  NSThread多线程并发
//
//  Created by aslan on 16/3/12.
//  Copyright © 2016年 aslan. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface KCImageData : NSObject

#pragma mark 索引
@property (nonatomic,assign)int index;

#pragma mark 图片数据
@property (nonatomic,strong)NSData * data;

@end

接下来将创建多个UIImageView并创建多个线程用于往UIImageView中填充图片。

//
//  ViewController.m
//  NSThread多线程并发
//
//  Created by aslan on 16/3/12.
//  Copyright © 2016年 aslan. All rights reserved.
//

#import "ViewController.h"
#import "KCImageData.h"

#define ROW_COUNT 5
#define COLUMN_COUNT 3
#define ROW_HEIGHT 100
#define ROW_WIDTH ROW_HEIGHT
#define CELL_SPACING 10

@interface ViewController ()


@property (nonatomic,strong)NSMutableArray * imageViews;
@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
{
    //创建多个图片控件用于显示图片
    _imageViews = [NSMutableArray array];
    
    for (int r = 0; r < ROW_COUNT; r++) {
        for (int c = 0; c < COLUMN_COUNT; c++) {
            UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(c*ROW_WIDTH+(c*CELL_SPACING), r*ROW_HEIGHT+(r*CELL_SPACING), ROW_WIDTH, ROW_HEIGHT)];
            
            imageView.contentMode = UIViewContentModeScaleAspectFit;
            
            
            [self.view addSubview:imageView];
            [_imageViews addObject:imageView];
        }
    }
    
    NSLog(@"imageView Cont = %ld",_imageViews.count);
    //添加按钮
    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];

}


- (void)loadImageWithMultiThread
{
    //创建多个线程用于填充图片
    for (int i = 0; i < ROW_COUNT*COLUMN_COUNT; i++) {
        NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(loadImage:) object:[NSNumber numberWithInt:i]];
        thread.name = [NSString stringWithFormat:@"mythread_%i",i];
        
        //改变线程优先级
        if(	i == 14)//最后一个线程优先级改成最高
            thread.threadPriority = 1.0;
        else
            thread.threadPriority = 0.5;
        
        
        [thread start];
    }
}

#pragma mark加载图片
-(void)loadImage:(NSNumber *)index
{
    //currentThread方法可以取得当前操作线程
    NSLog(@"current thread:%@",[NSThread currentThread]);
    
    int i = index.intValue;
    
    NSData * data = [self requestData:i];
    
    KCImageData * imageData = [[KCImageData alloc]init];
    imageData.index = i;
    imageData.data = data;
    
    [self performSelectorOnMainThread:@selector(updataImage:) withObject:imageData waitUntilDone:YES];
    
}

#pragma mark 将图片显示到界面
- (void)updataImage:(KCImageData *)imageData
{
    UIImage * image = [UIImage imageWithData:imageData.data];
    UIImageView * imageView = _imageViews[imageData.index];
    imageView.image = image;
}

- (NSData *)requestData:(int)index
{
    //对非最后一张图片加载线程 休眠2秒
    //在这里让其他线程休眠2秒,此时你就会看到最后一张图片总是第一个加载(除非网速特别差)
    if (index != 14) {
        [NSThread sleepForTimeInterval:2.0];
    }
    NSURL * url = [NSURL URLWithString:@"http://img.popoho.com/allimg/140703/2-140F3215917-lp.jpg"];
    NSData * data = [NSData dataWithContentsOfURL:url];
    return data;
}

@end



运行结果如下:


你可能感兴趣的:(IOS多线程--NSThread多线程并发)