1.简介
NSOperation是基于GCD封装的OC形式的API。用于创建任务。它是一个抽象类,它的使用方法是必须使用NSOperation的子类。
NSOperationQueue封装了线程的管理 可以管理队列中任务的并发数量,执行顺序,队列的暂停开启等。
2.NSOperation创建任务
NSOperation的使用方法是必须使用NSOperation的子类
1.NSInvocationOperation
NSInvocationOperation定义的调用操作是在主线程中执行的
// NSInvocationOperation定义的调用操作是在主线程中执行的
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocationMehtod) object:nil];
//开始任务
[invocationOperation start];
// 任务取消
// [customOperation cancel];
2.NSBlockOperation
创建blockOperation 添加一个任务,该任务是在主线程中执行的;当任务数大于1时,其余任务都是在分线程中执行的
// 创建blockOperation 添加一个任务,该任务是在主线程中执行的;当任务数大于1时,其余任务都是在分线程中执行的
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"任务1");
}];
// 以block形式添加任务
[blockOperation addExecutionBlock:^{
NSLog(@"任务2");
//开始任务
[blockOperation start];
// 任务取消
// [customOperation cancel];
3.自定义NSOperation子类
自定义一个继承与NSOperation的子类重写初始化方法,以Block形式添加任务
#import "LLOperation.h"
@interface LLOperation ()
@property (nonatomic, copy) void(^operationBlock)(id obj);
@end
@implementation LLOperation
- (instancetype)initWithExectionBlock:(void(^)(id obj))block
{
self = [super init];
if (self) {
self.operationBlock = block;
}
return self;
}
// main是主要处理任务的方法
- (void)main
{
self.operationBlock(nil);
}
@end
用自定义的类创建任务
LLOperation *customOperation = [[LLOperation alloc] initWithExectionBlock:^(id obj) {
NSLog(@"自定义NSOperation子类创建的任务");
}];
//开始任务
[customOperation start];
// 任务取消
// [customOperation cancel];
3.NSOperationQueue操作队列
把NSOperation子类对象加入到NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象的任务,直到这个对象的所有操作完成,然后它被队列释放。
1.创建队列向队列中添加任务
// 创建queue
NSOperationQueue queue = [[NSOperationQueue alloc] init];
// 向队列中添加操作 任务自动开始执行
[queue addOperation:customOperation];
[queue addOperation:invocationOperation];
// 将操作添加到队列中 该操作就是在分线程中执行的
2.设置队列的最大并发数
self.queue.maxConcurrentOperationCount = 4;
3.一次性向队列中添加多个操作,数组中存放的是NSO NSOperation子类对象
// 1.装有多个操作的数组 2.是否等待队列中的任务执行完毕 如果为YES会阻塞当前线程
[self.queue addOperations:array waitUntilFinished:NO];
4。取消所有操作
[self.queue cancelAllOperations];
5.任务暂停、开始
//任务开始
[queue setSuspended:YES];
//任务继续
[queue setSuspended:NO];
6.管理队列中任务的执行顺序,添加依赖
NSOperationQueue *queue = [NSOperationQueue new];
NSMutableArray *array2 = [NSMutableArray array];
NSBlockOperation *tmpOperation = nil;
for (int i=0; i<5; i++) {
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"任务%d",i);
// 模拟执行任务
[NSThread sleepForTimeInterval:3];
}];
//tmpOperation存在
if (tmpOperation) {
// 添加依赖,blockOperation的完成依赖于tmpOperation,tmpOperation完成后才执行blockOperation
[blockOperation addDependency:tmpOperation];
}
// 保存一下上次创建的operation
tmpOperation = blockOperation;
[array2 addObject:blockOperation];
}
[queue addOperations:array2 waitUntilFinished:NO];
输出结果: