多线程-NSOperation

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程-NSOperation相关的知识,希望对你有一定的参考价值。

NSOperation

NSOperation的使用:

    NSOperation需要和和NSOperationQueue实现多线程编程

  实现的具体步骤:

  1. 先将需要执行的操作封装到一个NSOperation对象中
  2. 然后将NSOperation对象添加到NSOperationQueue中
  3. 系统会自动将NSOperationQueue中的NSOperation取出来
  4. 将取出的NSOperation封装的操作放到一条新线程中执行

注意:NSOperation是一个抽象类,不具备分装操作的能力必须使用它的子类

  •   NSInvocationOperation
  •   NSBlockOperation
  •   自定义子类继承NSOperation,实现内部相应的方法(-main方法)

这里介绍一下上面提到的操作 想到于GCD中的队列,封装一些你要中的事情(任务)

NSOperation各个子类的基本使用:

  NSInvocationOperation

 

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSInvocationOperation *invovationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task) object:nil];
    
    [invovationOperation start];
}

- (void)task
{
    NSLog(@"%@", [NSThread currentThread]);
}

 

输出结果:

2016-03-29 23:14:31.262 test1[1440:105145] <NSThread: 0x7fcba5101dc0>{number = 1, name = main}

分析,说明使用NSInvocationOperation并不会开辟子线程执行封装的任务,我们在看一下NSBlockOperation

 

NSBlockOperation的使用

 NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i<3; i++) {
            NSLog(@"A------%@", [NSThread currentThread]);
        };
    }];
    
    [blockOp start];

输出结果:

2016-03-29 23:21:00.211 test1[1470:107920] A------<NSThread: 0x7fda63805010>{number = 1, name = main}
2016-03-29 23:21:00.212 test1[1470:107920] A------<NSThread: 0x7fda63805010>{number = 1, name = main}
2016-03-29 23:21:00.212 test1[1470:107920] A------<NSThread: 0x7fda63805010>{number = 1, name = main}

分析得到结果:NSBlockOperation单独使用也需要调用start方法,并且不会开辟子线程执行任务,但是我们看一下下面的情况,当block追加操作的时候,追加的操作会在子线程中执行并且是并发执行的

注意:
默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作
只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作 并且内部会调用start方法
  NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i<3; i++) {
            NSLog(@"A------%@", [NSThread currentThread]);
        };
    }];
/********************************blcokOperation追加任务********************************/
    [blockOp addExecutionBlock:^{
        for (int i = 0; i<3; i++) {
            NSLog(@"B------%@", [NSThread currentThread]);
        };
    }];
/********************************blcokOperation追加任务********************************/
    [blockOp addExecutionBlock:^{
        for (int i = 0; i<3; i++) {
            NSLog(@"C------%@", [NSThread currentThread]);
        };
    }];
    [blockOp start];

输出结果:

2016-03-29 23:24:58.883 test1[1508:110154] A------<NSThread: 0x7fd3905062c0>{number = 1, name = main}
2016-03-29 23:24:58.883 test1[1508:110187] C------<NSThread: 0x7fd390700130>{number = 2, name = (null)}
2016-03-29 23:24:58.883 test1[1508:110186] B------<NSThread: 0x7fd3919b7290>{number = 3, name = (null)}
2016-03-29 23:24:58.883 test1[1508:110154] A------<NSThread: 0x7fd3905062c0>{number = 1, name = main}
2016-03-29 23:24:58.883 test1[1508:110154] A------<NSThread: 0x7fd3905062c0>{number = 1, name = main}
2016-03-29 23:24:58.883 test1[1508:110186] B------<NSThread: 0x7fd3919b7290>{number = 3, name = (null)}
2016-03-29 23:24:58.883 test1[1508:110187] C------<NSThread: 0x7fd390700130>{number = 2, name = (null)}
2016-03-29 23:24:58.884 test1[1508:110186] B------<NSThread: 0x7fd3919b7290>{number = 3, name = (null)}
2016-03-29 23:24:58.884 test1[1508:110187] C------<NSThread: 0x7fd390700130>{number = 2, name = (null)}

 

注意:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作

将操作添加进NSOperationQueue的使用

首先我们要靠接NSOperationQueue的两种类型及创建方式

  

NSOperationQueue *queue = [NSOperationQueue mainQueue];

 注意:通过mainQueue 创建的队列中的任务,不会创建子线程,在主队列中执行

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

 注意:通过alloc init的方式创建的队列会开启子线程执行任务,并且是并发执行任务的,那么我们怎么向GCD中那样让队列中的任务串行执行任务呢

那么可以以通过线面的属性来设置最大的并发数 当值为1的时候,队列会开启子线程并且是串行执行队列中的任务,在实际的开发,建议一般创建最多子线程的条数为3~5

queue.maxConcurrentOperationCount = 1;

 

队列的取消、暂停、恢复

 

操作依赖

 

操作的监听

 

自定义NSOperation

 

自定义NSOperation下载图片思路 – 无沙盒缓存

技术分享

    

 

以上是关于多线程-NSOperation的主要内容,如果未能解决你的问题,请参考以下文章

什么是多线程,多进程?

多线程和多进程模式有啥区别

多线程Java多线程学习笔记 | 多线程基础知识

java中啥叫做线程?啥叫多线程?多线程的特点是啥

c++ 多线程与c多线程有啥区别?

IOS多线程安全(线程锁)