NSOperation - 01

NSOperation

在介绍NSOperation之前,我们来看看IOS中多线程的实现方案有哪些?都有什么特点?

1pthread 基于C语言,线程的生命周期是由程序员管理的;

1)一套通用的多线程API

2)适用于Unix\Linux\Windows

3)跨平台、可移植

4)使用难度大

2NSThread 基于OC语言,线程生命周期也是由程序员管理的;

1)使用更加面向对象

2)简单易用,可直接操作线程对象

3GCD  基于C语言,线程生命周期是由自己管理的;

1)旨在替代NSThread等线程技术

2)充分利用设备的多核

4NSOperation 基于OC语言,线程生命周期

1)基于GCD(底层是GCD

2)比GCD多了一些更简单实用的功能

3)使用更加面向对象


NSOperation的作用:

配合使用NSOperationNSOperationQueue也能实现多线程编程


NSOperationNSOperationQueue实现多线程的具体步骤:

1,先将需要执行的操作封装到一个NSOperation对象中

2,然后将NSOperation对象添加到NSOperationQueue

3,系统会自动将NSOperationQueue中的NSOperation取出来

4,将取出的NSOperation封装的操作放到一条新线程中执行


NSOperation是一个抽象类,并不具备封装操作的能力,必须使用它的子类


使用NSOperation子类的方式有3种:

1NSInvocationOperation

2NSBlockOperation

3,自定义子类继承NSOperation,实现内部相应的方法


创建NSInvocationOperation对象:

- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;

调用start方法开始执行操作:

- (void)start;  一旦执行操作,就会调用targetsel方法;

注意:

默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作;

代码如下:

- (void)invocationOperation

{

    // 1.创建操作对象,封装要执行的任务

    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];

    

    // 2.执行操作(默认情况下,如果操作没有放到队列queue,都是同步执行)

    [operation start];

}


创建NSBlockOperation对象

+ (id)blockOperationWithBlock:(void(^)(void))block;

通过addExecutionBlock:方法添加更多的操作

- (void)addExecutionBlock:(void(^)(void))block;

注意:

只要NSBlockOperation封装的操作数>1,就会异步操作

NSBlockOperation *operation = [[NSBlockOperation alloc] init];

[operation addExecutionBlock:^{

    NSLog(@"NSBlockOperation");

}];

}];

// 2.执行操作

[operation start];


operation队列:代码如下:

NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];

NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{

    NSLog(@"NSBlockOperation------下载图片2---%@", [NSThread currentThread]);

}];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

queue.maxConcurrentOperationCount = 2;

[queue addOperation:operation1];

[queue addOperation:operation2];


你可能感兴趣的:(多线程,ios,NSOperation)