ios开发- NSOperation高级功能

直接上代码

示例1:

@interface TBViewController()

//队列

@property(nonatomic,strong)NSOperationQueue *queue;

@end

//队列的暂停和继续(在storyboard中拖两个按钮,分别为暂停、继续,连线)

//暂停

-(IBAction)pause

{

  if(self.queue.operationCount == 0){

  NSLog(@"无操作");

  return;

}

 

  //挂起》暂停  暂停的是队列,让队列暂时不再派发任务

  NSLog(@"暂停");

  [self.queue setSuspended:YES];  

}

//继续

-(IBAction)resumue

{

  if(self.queue.operationCount == 0){

  NSLog(@"无操作");

  return;

}

  NSLog(@"继续");

  [self.queue setSuspended:NO];

}

//懒加载

-(NSOperationQueue *)queue

{

  if(_queue == nil){

  _queue = [[NSOperationQueue alloc]init];

}

  return _queue;

}

 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

  [self opDemo1];

}

//同时并发线程数量

-(void)opDemo1

{

  //线程开启的队列是由GCD底层决定的,程序员不能参与

 

/*

设置最大并发数的好处:线程开启有消耗

3G:     2~3条线程,线程少,流量少,省钱,省电

WIFI:   5~6条线程,线程多,效率高,流量大,不花钱,可以随时充电

*/

 

  self.queue maxConcurrentOperationCount = 3;//最大并发数量

  for(int i = 0;i < 100; i ++){

    [self.queue addOperationWithBlock:^{

      //阻塞

        [NSThread sleepForTimeInterval:2];

      NSLog(@"%@ %d",[NSThread currentThread];)

}];

}

}

 

示例2:操作的依赖-》操作的执行顺序

-(void)opDemo3

{

  /*

  例如:

  1、下载小电影的压缩包

  2、解压缩

  3、保存文件

  4、通知用户

  */

NSBlockOperation*op1 = [NSBlockOperation blockOperationWithBlock:^{

    NSLog(@"下载:%@",[NSThread currentThread]);

}];

NSBlockOperation*op2 = [NSBlockOperation blockOperationWithBlock:^{

    NSLog(@"解压缩:%@",[NSThread currentThread]);

}];

NSBlockOperation*op3 = [NSBlockOperation blockOperationWithBlock:^{

    NSLog(@"保存:%@",[NSThread currentThread]);

}];

NSBlockOperation*op4 = [NSBlockOperation blockOperationWithBlock:^{

    NSLog(@"通知用户:%@",[NSThread currentThread]);

}];

  //依赖

  [op2 addDependency:op1];

  [op3 addDependency:op3];

  [op4 addDependency:op3];

  //循环依赖(一定不要出现)

  [op1 addDependency:op4];

  

  //异步的  waitUntilFinished  等待所有操作完成在继续

  [self.queue addOperations:@[op1,op2,op3] waitUntilFinished:NO];

//主队列

  [[NSOperationQueue mainQueue] addOperation:op4];

}

 

总结:

/*

  NSOperation

1.是对GCD的封装

2、是OC的,面向对象的,使用更加容易

3、提供了一些特殊的方法,是GCD不容易实现的,例如:最大并发线程数量、暂停和继续

4、可以指定操作的依赖关系,依赖关系是可以跨队列的

5、自定义的队列,是并发队列,操作是异步任务

 

  GCD

1、是C语言的,难度有点大

2、once

3、after

4、GCD还有非常多复杂的功能

*/

 

你可能感兴趣的:(Opera)