#import "ViewController.h" @interface ViewController () @property(nonatomic,retain)NSOperationQueue *queue; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark -Queue控制方法- //暂停 -(IBAction)btnPause:(id)sender { //1.正在执行的任务不能暂停 //2.只能暂停未开始的任务 //3.默认是并发执行的,如果想控制队列,只能通过依赖关系, //4.使其变成串行之后才能执行??? [self.queue setSuspended:YES]; } //继续 -(IBAction)btnResume:(id)sender { //取消所有 //1.正在执行的任务不能取消 //2.只能取消未开始的任务 [self.queue setSuspended:NO]; } //取消 -(IBAction)btnCancel:(id)sender { [self.queue cancelAllOperations]; } #pragma mark -NSOperation- /** NSOperationQueue */ -(IBAction)playOnQueueControlMore:(id)sender { NSInvocationOperation *iop1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(eat) object:nil]; NSInvocationOperation *iop2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(drink) object:nil]; //依赖关系 //1.决定了任务执行的先后顺序 被依赖者先执行 //2.如果被依赖者没有加进来,就不会执行 //3.依赖关系优先级最高 [iop1 addDependency:iop2]; NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue addOperation:iop1]; [queue addOperation:iop2]; self.queue = queue; } /** * 控制NSOperationQueue来执行 */ -(IBAction)playOnQueueControl:(id)sender { NSInvocationOperation *iop1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(eat) object:nil]; NSInvocationOperation *iop2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(drink) object:nil]; //依赖关系 //1.决定了任务执行的先后顺序 被依赖者先执行 //2.如果被依赖者没有加进来,就不会执行 //3.依赖关系优先级最高 [iop1 addDependency:iop2]; NSOperationQueue *queue = [[NSOperationQueue alloc]init]; // [queue addOperation:iop1]; // [queue addOperation:iop2]; //是否等待队列中的任务都执行完再去执行后面的逻辑代码 [queue addOperations:@[iop1,iop2] waitUntilFinished:YES]; //等待所有的任务都完成后(挂起主线程),再去执行其他(主线程继续) [queue waitUntilAllOperationsAreFinished]; NSLog(@"任务完成");//这条代码是由主线程完成的 } /** 创建NSOperationQueue来执行 */ -(IBAction)playOnQueue:(id)sender { //创建任务 NSInvocationOperation *iop1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(eat) object:nil]; NSInvocationOperation *iop2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(drink) object:nil]; NSBlockOperation *bop = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"shut up%@",[NSThread currentThread]); NSLog(@"毒蛇"); }]; [bop addExecutionBlock:^{ [self sleep]; }]; //创建一个任务队列 //1.把任务交给队列管理,队列内的任务是并发执行的 //2.任务都是在子线程运行的 //3.不会阻塞主线程 //4.不需要调用start方法,自动就执行了 //5.可以设定最大的并发数量(需要在添加任务之前设定,会按照任务顺序执行) NSOperationQueue *queue = [[NSOperationQueue alloc]init]; //把任务交给队列来执行和管理 queue.maxConcurrentOperationCount = 2; [queue addOperation:iop1]; [queue addOperation:iop2]; [queue addOperation:bop]; //同一时间内最大的并发数量 //公司用的GCD 多 但是朝opreation 发张 } /** * 在主线程演示卡顿 */ -(IBAction)playOnMain:(id)sender { //申请一个操作 //默认是一个主线程 // NSInvocationOperation *iop = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(eat) object:nil]; // [iop start]; //创建一个block类型的操作 NSBlockOperation *bop = [NSBlockOperation blockOperationWithBlock:^{ [self eat]; }]; //追加执行一个block; //会开启线程并行执行 [bop addExecutionBlock:^{ [self drink]; }]; //添加完成结束后的block bop.completionBlock = ^{ [self sleep]; }; [bop start]; } #pragma mark -任务- -(void)eat{ int i = 0; while (i++ < 10) { NSThread *th = [NSThread currentThread]; NSLog(@"%@",th); NSLog(@"已经吃了%d碗了,不怕胖吗",i); [NSThread sleepForTimeInterval:1]; } } -(void)drink{ int i = 0; while (i++ < 10) { NSThread *th = [NSThread currentThread]; NSLog(@"%@",th); NSLog(@"已经喝了%d瓶了",i); [NSThread sleepForTimeInterval:1]; } } -(void)sleep{ int i = 0; while (i++ < 10) { NSThread *th = [NSThread currentThread]; NSLog(@"%@",th); NSLog(@"已经睡了%d天了,你是
NSOperationQueue 线程池的使用
最新推荐文章于 2016-05-10 20:22:54 发布