美文网首页程序员iOS开发代码段
iOS多线程篇-NSOperation简单介绍

iOS多线程篇-NSOperation简单介绍

作者: LitterL | 来源:发表于2016-01-13 19:29 被阅读167次

    简述

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

    补充:只要`NSBlockOperation`封装的操作数 > 1,就会异步执行操作
    
    • NSOperationQueue基本使用

    在上面子类中演示了调用start方法执行任务都是默认同步执行的,除了NSBlockOperation封装的操作数 > 1以外,在这里的话我们就将任务添加到队列中,去看看它是如何异步执行;

    ```objc
    NSOperation中是有两种队列
        01 主队列 通过mainQueue获得,凡是放到主队列中的任务都将在主线程执行
        02 非主队列 直接alloc init出来的队列。非主队列同时具备了并发和串行的功能,通过设置最大并发数属性来控制任务是并发执行还是串行执行
    ```
    代码:
    
    ```objc
    -(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简单介绍

        本文链接:https://www.haomeiwen.com/subject/txickttx.html