一、定义:
GCD是基于C的底层API,而NSOperation则是封装GCD实现Objective-C API
NSOperationQueue【操作队列】:用来存放操作的队列
NSOperationQueue有两种不通类型的队列:主队列和自定义队列。主队列在主线程上运行,而自定义队列在后台执行。这两种队列中加入的任务都需要用NSOperation的子类来表示
二、使用
主要步骤: 第一步、创建队列 ;
第二步、创建任务;
第三步、 添加依赖;
第四步 、将任务添加到队列中 。
第一步创建队列
队列的类型:主队列和自定义队列
1、主队列
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
2、自定义队列
==注意: 自定义队列里的任务,可以通过设置操作队列的 maxConcurrentOperationCount的值来控制操作的串行执行还是并发执行 当maxConcurrentOperationCount = 1的时候,是串行执行。 maxConcurrentOperationCount > 1的时候是并发执行,但是这个线程开启的数量最终还是由系统决定的==
NSOperationQueue *customQueue = [[NSOperationQueue alloc]init];
customQueue.maxConcurrentOperationCount = 5;
第二步创建队列操作
两种方式 NSInvocationOperation NSBlockOperation的使用
第一种:NSInvocationOperation
NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(task:) object:@"1"];
- (void)task:(NSString *)order{}
第二种:NSBlockOperation
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
[self task:@"2"];
}];
扩展:一个队列操作可以持续添加操作。一个操作中多次添加任务的话,系统会开启新的线程,并发执行操作中的任务。
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
[self task];
}];
[op addExecutionBlock:^{
[self task:@"add1"];
}];
[op addExecutionBlock:^{
[self task:@"add2"];
}];
第三步添加依赖 和优先级
==注意:1、如果添加了依赖关系,在主队列串行执行任务,也不是先进先出的规则。而是按照依赖关系的属性执行。 应该把操作的所有配置都配置好后,再加入队列,因为加入队列后,操作就开始执行了 2、不能设置双向依赖,如果op1依赖op2,op2又反过来依赖op1,则会出现互相等待的死锁情况 3==
[op1 addDependency:op2];
[op2 addDependency:op3];
第四步 将任务添加到队列中
[customQueue addOperation:op1];