zoukankan      html  css  js  c++  java
  • 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还有非常多复杂的功能

    */

  • 相关阅读:
    PHP如何获取内网IP
    开源的世界并不纯净
    在linux下玩上了第一人称射击
    终于,在linux下上网了
    我的理想
    vista是什么
    我傻了一阵子
    又是大端小端!!!
    谈谈最近的编程状态
    如何快速发布你的C++Builder程序
  • 原文地址:https://www.cnblogs.com/gtbo/p/4039253.html
Copyright © 2011-2022 走看看