NSOperation是对GCD的封装,面向对象,比gcd更易于使用
优点:可添加完成的代码块,添加操作之间的依赖,方便控制之下顺序,可以设定优先级,可使用kvo观察操作执行状态。NSOperation是一个抽象类,不能直接使用,有2个抽象类NSInvocationOperation,NSBlockOperation
NSOperatiaon引进了操作(任务)和操作队列(队列)的概念
2.常用方法
1.创建队列
//主队列
NSOperationQueue *queue = [NSOperationQueue mainQueue];
//其他队列
NSOpreationQueue *OtherQueue = [NSOperationQueue alloc]init];
2、添加任务到队列里
[queue addOperation:blockOperation];
【OtherQueue addOperations:(NSArray*):waitUntilfinished:(BOOL)】是否组塞当前线程直到所有操作结束
3、让队列里面,所有的Operation都取消
[queue cancelAllOperations];
4、获取当前线程对列
[NSOperationQueue currentQueue]
5、获取主线程对列
[NSOperationQueue mainQueue]
6、添加任务间的依赖关系,前者依赖于后者的完成,也就是后者执行完,前者才能执行,依赖关系需要放在添加到队列之前设置
[invocation addDependency:blockOperation];
removeDependency:op 删除依赖
dependencies:返回依赖组
7.优先级
quequePriority:设置队列中任务的优先级,枚举
NSOperationQueuePriorityVeryLow = -8L,
NSOperationQueuePriorityLow = -4L,
NSOperationQueuePriorityNormal = 0,
NSOperationQueuePriorityHigh = 4,
NSOperationQueuePriorityVeryHigh = 8
8. maxConcurrentOperationCount:(最大操作并发数)意思是一个队列中能同时进行多少个不同类型的任务。而不是开启多少条线程,注意:需要在任务加入队列提前设置
比如:由2个任务a,b,每一个任务有各自追加了2个子任务 6个操作任务 当我们默认为-1时是同时执行不同类型的任务,同时执行2种任务也就是并行执行了2*2+2个的任务,线程的条数不确定由系统分配。
当我们设置为1时,那么同时能执行一种类型的任务,并行执行了3个任务
3.NSOperation实现多线程步骤
1.创建操作
2.创建操作队列
3.将操作添加到队列中
4.NSInvocationOperation使用
主队列中不会开启新线程
NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
开启操作
[op start];
5.NSBlockOperation使用
1.不追加操作的话
如果不追加操作的话是不会开启新线程。会在当前线程中执行,如果追加操作的话会开启新的线程,并且blokop也会在其他线程中执行,开启的线程由系统决定
NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
[self test];
}];
[blockOp start];
2.追加操作的话
NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
[self test];
}];
//addexecutionBlock 添加新的操作,运行顺序不确定 增加新的线程
[blockOp addExecutionBlock:^{
for (NSInteger i=0; i<5;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"NSBlock新的操作1----- %@",[NSThread currentThread]);
}
}];
[blockOp addExecutionBlock:^{
for (NSInteger i=0; i<5;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"NSBlock新的操作2----- %@",[NSThread currentThread]);
}
}];
[blockOp start];
总结:NSBlockOperation追加操作的话会开启线程,但是顺序不确定
3.NSBlockOperation添加依赖实现按顺序执行
NSBlockOperation *blockop1 = [NSBlockOperation blockOperationWithBlock:^{
for (NSInteger i=0; i<5;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block1---0操作 %@",[NSThread currentThread]);
}
}];
[blockop1 addExecutionBlock:^{
for (NSInteger i=0; i<4;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block1-----1操作 %@",[NSThread currentThread]);
}
}];
[blockop1 addExecutionBlock:^{
for (NSInteger i=0; i<3;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block1add-----2操作 %@",[NSThread currentThread]);
}
}];
NSBlockOperation *blockop2 = [NSBlockOperation blockOperationWithBlock:^{
for (NSInteger i=0; i<7;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block2----总操作 %@",[NSThread currentThread]);
}
}];
[blockop2 addExecutionBlock:^{
for (NSInteger i=0; i<6;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block2add-----1操作 %@",[NSThread currentThread]);
}
}];
//添加依赖:按顺序执行
[blockop2 addDependency:blockop1];
[blockop3 addDependency:blockop2];
//自定义队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount = 1;
[queue addOperations:@[blockop1,blockop2] waitUntilFinished:NO];
4线程间通信
// //线程间通信
[queue addOperationWithBlock:^{
//主队列
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
//添加任务
}];
}];