首页 > 代码库 > 多线程 NSOpeartion 的使用

多线程 NSOpeartion 的使用

NSOperation简介

相对于 GCD ,具有面向对象的特征,比 GCD 更简单易用,代码可读性强

NSOperatioin 单独使用时, 不具有开辟新线程的能力, 只是同步执行操作, 需要配合 NSOpeationQueue 来实现多线程操作

//验证: 没有队列时, 同步执行

<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1d9421 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #6122ae } p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3d1d81 } p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; min-height: 21.0px } p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1d9421 } span.s1 { } span.s2 { font: 18.0px "PingFang SC" } span.s3 { color: #c32275 } span.s4 { color: #000000 } span.s5 { color: #3d1d81 } span.s6 { color: #c91b13 } span.s7 { color: #6122ae } span.s8 { font: 18.0px Menlo; color: #000000 } span.s9 { font: 18.0px Menlo }</style>

//子类 NSBlockOperation

//NSBlockOperation还提供了一个方法addExecutionBlock:

//额外添加 block 任务

- (void)blockOperation{

    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"------%@", [NSThread currentThread]);

 

    }];

    

    // 添加额外的任务(在子线程执行)

    [op addExecutionBlock:^{

        NSLog(@"2------%@", [NSThread currentThread]);

    }];

    [op addExecutionBlock:^{

        NSLog(@"3------%@", [NSThread currentThread]);

    }];

    [op addExecutionBlock:^{

        NSLog(@"4------%@", [NSThread currentThread]);

    }];

 

    

    //直接执行,没有放到 queue ,不会开启新线程,在主线程中执行

    [op start];

    

}

 

一.使用步骤:

1.创建队列

2.创建任务

3.将任务添加到队列中(异步执行, 开启新线程)

<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1d9421 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1d9421 } p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #6122ae } p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; min-height: 21.0px } p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #703daa } p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3d1d81 } span.s1 { font: 18.0px Menlo } span.s2 { } span.s3 { color: #c32275 } span.s4 { color: #000000 } span.s5 { font: 18.0px "PingFang SC" } span.s6 { color: #3d1d81 } span.s7 { color: #0435ff } span.s8 { color: #c91b13 } span.s9 { color: #6122ae } span.s10 { font: 18.0px Menlo; color: #000000 }</style>

//任务 添加 到队列中

//在队列中 开启新线程

- (void)addTaskToQueue{

    //1.创建队列

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

    // 2. 创建操作

    // 创建NSInvocationOperation

    NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];

    // 创建NSBlockOperation

    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

        for (int i = 0; i < 2; ++i) {

            NSLog(@"2-----%@", [NSThread currentThread]);

        }

    }];

    

    

    //--添加依赖

    //2 依赖1 ,则必须 1 完成之后,才会执行2

    [op2 addDependency:op1];

    

    //--设置最大并发数

//    queue.maxConcurrentOperationCount = 1; 只能同时执行 1 个任务,变成了串行队列

    queue.maxConcurrentOperationCount = 2;

 

    

  

    //3.将任务添加到队列中

    [queue addOperation:op1];

    [queue addOperation:op2];

 

    //4.不需要创建任务,queueu直接添加 block 任务

    [queue addOperationWithBlock:^{

        for (int i = 0; i < 2; ++i) {

            NSLog(@"3-----%@", [NSThread currentThread]);

        }

    }];

    

    

    

    

}

二.特性方法

1.任务之间可以添加依赖

<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1d9421 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; min-height: 21.0px } span.s1 { } span.s2 { font: 18.0px "PingFang SC" } span.s3 { color: #000000 } span.s4 { color: #3d1d81 }</style>

//--添加依赖

    //2 依赖1 ,则必须 1 完成之后,才会执行2

    [op2 addDependency:op1];

    

2.队列可以设置最大并发数

<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1d9421 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #703daa } span.s1 { color: #000000 } span.s2 { } span.s3 { font: 18.0px "PingFang SC" } span.s4 { color: #0435ff }</style>

    //--设置最大并发数

//    queue.maxConcurrentOperationCount = 1; 只能同时执行 1 个任务,变成了串行队列

    queue.maxConcurrentOperationCount = 2;

 

三.其他方法

  • - (void)cancel; NSOperation提供的方法,可取消单个操作
  • - (void)cancelAllOperations; NSOperationQueue提供的方法,可以取消队列的所有操作
  • - (void)setSuspended:(BOOL)b; 可设置任务的暂停和恢复,YES代表暂停队列,NO代表恢复队列
  • - (BOOL)isSuspended; 判断暂停状态

注意: 暂停 和 取消 并不代表可以将当前的操作 立即取消或暂停, 而是将当前的操作执行完成之后, 不再执行其他的新操作了

暂停与取消的 区别: 是否可以继续向下执行

 

多线程 NSOpeartion 的使用