简述
NSOperation是对GCD的包装
两个核心概念【队列+操作】
01 NSOperation本身是抽象类,只能使用它的子类
02 三个子类分别是:
1、NSInvocationOperation
2、NSBlockOperation
03 NSOperation和NSOperationQueue结合使用实现多线程并发
代码
-
NSInvocationOperation基本使用
-(void)demo1{ //1.封装操作 /* 第一个参数:目标对象 第二个参数:该操作要调用的方法,最多接受一个参数 第三个参数:调用方法传递的参数,如果方法不接受参数,那么该值传nil */ NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil]; //2.启动操作 [operation start]; }
补充:只要执行操作,就会调用
target
的run
方法,,但是执行的结果默认为主线程调用(这里的话我就不上图了),只有添加到NSOperationQueue
中才会开启新的线程,没有添加到NSOperationQueue
中,都是同步执行,后面会介绍NSOperationQueue
,如何实现异步执行 -
NSBlockOperation基本使用
-(void)demo2{ NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ //在主线程中执行 NSLog(@"---LitterL_1--%@",[NSThread currentThread]); }]; //2.追加操作,追加的操作在子线程中执行 [operation addExecutionBlock:^{ NSLog(@"---LitterL_2--%@",[NSThread currentThread]); }]; [operation addExecutionBlock:^{ NSLog(@"---LitterL_3--%@",[NSThread currentThread]); }]; //3.启动执行操作 [operation start]; }
补充:只要`NSBlockOperation`封装的操作数 > 1,就会异步执行操作
-
NSOperationQueue基本使用
在上面子类中演示了调用start
方法执行任务都是默认同步执行的,除了NSBlockOperation
封装的操作数 > 1以外,在这里的话我们就将任务添加到队列中,去看看它是如何异步执行;
NSOperation中是有两种队列
01 主队列 通过mainQueue获得,凡是放到主队列中的任务都将在主线程执行
02 非主队列 直接alloc init出来的队列。非主队列同时具备了并发和串行的功能,通过设置最大并发数属性来控制任务是并发执行还是串行执行
代码:
-(void)demo3{
//1.创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//2.封装操作
NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download) object:nil];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"2----%@",[NSThread currentThread]);
}];
[op2 addExecutionBlock:^{
NSLog(@"3----%@",[NSThread currentThread]);
}];
//3、添加到队列中去
[queue addOperation:op1];
[queue addOperation:op2];
//4、补充:简便方法
[queue addOperationWithBlock:^{
NSLog(@"4----%@",[NSThread currentThread]);
}];
}
-(void)download{
NSLog(@"1----%@",[NSThread currentThread]);
}
结束
本章到此结束
欢迎各位码友随意转载并指正