IOS多线程开发-NSOperation

使用NSOperation和NSOperationQueue进行多线程开发类似于C#中的线程池,只要将一个NSOperation(实际开中需要使用其子类NSInvocationOperation、NSBlockOperation)放到NSOperationQueue这个队列中线程就会依次启动。NSOperationQueue负责管理、执行所有的NSOperation,在这个过程中可以更加容易的管理线程总数和控制线程之间的依赖关系。

NSOperation有两个常用子类用于创建线程操作:NSInvocationOperation和NSBlockOperation,两种方式本质没有区别,但是是后者使用Block形式进行代码组织,使用相对方便。

NSInvocationOperation

点击加载图片:

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

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;


@property (weak, nonatomic) IBOutlet UIButton *btn;

@end

@implementation ViewController

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


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction)btnClick:(id)sender {
    
    [self loadImageWithMultiThread];
}

- (void)loadImageWithMultiThread
{
    //创建一个操作
    NSInvocationOperation * invocationOperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(loadImage) object:nil];
    //创建完NSInvocationOperation对象并不会调用,它由一个start方法启动操作,但是注意如果直接调用start方法,则此操作会在主线程中调用,一般不会这么操作,而是添加到NSOperationQueue中
    //    [invocationOperation start];
    
    //创建操作队列
    NSOperationQueue * operationQueue = [[NSOperationQueue alloc]init];
    //注意添加到操作队列后,队列会开启一个线程执行此操作
    [operationQueue addOperation:invocationOperation];
}

- (void)loadImage
{
    NSData * data = [self requestData];
    NSLog(@"%@",[NSThread currentThread]);
    UIImage * image = [UIImage imageWithData:data];
    //更新UI界面
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        NSLog(@"----%@",[NSThread currentThread]);
        _imageView.image = image;
    }];
}

- (NSData *)requestData
{
    NSURL * url = [NSURL URLWithString:@"http://img.popoho.com/allimg/140703/2-140F3215917-lp.jpg"];
    NSData * data = [NSData dataWithContentsOfURL:url];
    
    return data;
}
@end


IOS多线程开发-NSOperation_第1张图片

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