多线程篇-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];
}
```

<img src="http://images2015.cnblogs.com/blog/731729/201601/731729-20160113192021632-346451987.png" style="width:760px;">

补充:只要`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]);
}
```
<img src="http://images2015.cnblogs.com/blog/731729/201601/731729-20160113191953444-1260076766.png" style="width:760px;">

结束

                  本章到此结束
            欢迎各位码友随意转载并指正
posted @ 2016-01-13 19:25  周大萌的萌  阅读(149)  评论(0编辑  收藏  举报