NSOperation
在介绍NSOperation之前,我们来看看IOS中多线程的实现方案有哪些?都有什么特点?
1,pthread 基于C语言,线程的生命周期是由程序员管理的;
(1)一套通用的多线程API
(2)适用于Unix\Linux\Windows
(3)跨平台、可移植
(4)使用难度大
2,NSThread 基于OC语言,线程生命周期也是由程序员管理的;
(1)使用更加面向对象
(2)简单易用,可直接操作线程对象
3,GCD 基于C语言,线程生命周期是由自己管理的;
(1)旨在替代NSThread等线程技术
(2)充分利用设备的多核
4,NSOperation 基于OC语言,线程生命周期
(1)基于GCD(底层是GCD)
(2)比GCD多了一些更简单实用的功能
(3)使用更加面向对象
NSOperation的作用:
配合使用NSOperation和NSOperationQueue也能实现多线程编程
NSOperation和NSOperationQueue实现多线程的具体步骤:
1,先将需要执行的操作封装到一个NSOperation对象中
2,然后将NSOperation对象添加到NSOperationQueue中
3,系统会自动将NSOperationQueue中的NSOperation取出来
4,将取出的NSOperation封装的操作放到一条新线程中执行
NSOperation是一个抽象类,并不具备封装操作的能力,必须使用它的子类
使用NSOperation子类的方式有3种:
1,NSInvocationOperation
2,NSBlockOperation
3,自定义子类继承NSOperation,实现内部相应的方法
创建NSInvocationOperation对象:
- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;
调用start方法开始执行操作:
- (void)start; 一旦执行操作,就会调用target的sel方法;
注意:
默认情况下,调用了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];