iOS多线程篇-NSOperation简单介绍

简述

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];
    }
    

    补充:只要执行操作,就会调用targetrun方法,,但是执行的结果默认为主线程调用(这里的话我就不上图了),只有添加到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];
    }
    
iOS多线程篇-NSOperation简单介绍_第1张图片
补充:只要`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]);
 }
iOS多线程篇-NSOperation简单介绍_第2张图片

结束

                  本章到此结束
            欢迎各位码友随意转载并指正

你可能感兴趣的:(iOS多线程篇-NSOperation简单介绍)