NSOperation kongleifeng深究

1.NSOperation 简介

NSOperation 苹果提供给我们的一套多线程解决方案基于GCD更高一层的封装,更加简洁易用、代码可读性高。

NSOperation 实现多线程异步执行三步曲:(1)、创建任务 NSOperation(2)、创建队列 NSOperationQueue(3)、将任务放到队列中 将NSOpration 对象添加到 NSOprationQueue 中。

系统会自动将 NSOperationQueue 中的 NSOperation 取出来,在新的线程中进行操作。

2.NSOperation和NSOperationQueue的基本使用

NSOperation 本身不能创建任务。为什么不能创建任务,因为 NSOperation 抽象类不能直接创建任务。怎么创建任务呢。创建任务有三种方式。(1)、NSInvocationOperation (2) 、NSBlockOperation (3)、NSOperation 的子类。

NSOperation 本身不能创建线程,同步执行。怎么实现多线程呢,NSOpertaionQueue出现。NSOperationQueue可以创建新的线程的能力,只有配合 NSOperationQueue 才能实现异步执行。

NSOperationQueue 为什么出现呢,因为 NSOperation 创建的任务需要放到 Queue 中才能正常的逻辑。
如何创建 NSOperationQueue 呢。主队列 mainQueue 和非主队列。

[NSOperationQueue addoperationwithblock];这个方式添加任务到 NSOpertaionQueue 中。

3.控制串行执行和并行执行的关键

NSOperationQueue 默认是并行执行。最大并发数 maxConcurrentOperationCount = 1 的时候 是串行执行。maxCuncurrentOperationCount 为其他值的时候 同步执行的。

4.操作依赖

addDependency 添加依赖。为什么会出现添加依赖这个功能呢。NSOperation 创建任务放到 NSOperationQueue 中执行是异步执行的,添加依赖就相同步执行。

5.一些其他的方法

cancel 可以取消单个操作。NSOperation 提供的方法。
cancelAllOperation 取消队列中的所有操作。 NSOperationQueue 提供的方法。
setSuspended 可设置任务的暂停和恢复。
isSuspended 判断暂停状态。

备注:
暂停和取消的区别。暂停之后可以恢复。取消之后不能恢复,无法执行剩下的所有的操作。

这里的暂停和取消并不代表可以将当前的操作立即取消而是当当前的操作执行完毕之后不在执行新的操作了。

  • (void)viewDidLoad {
    [super viewDidLoad];

    // 1. 创建任务 2. 创建队列 3.将任务放入到队列中

    // 1. 创建任务的三种方式 (1)NSInvocationOperation(2)NSBlockOperation(3)继承 NSOperation 子类
    NSInvocationOperation *inOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocationTest) object:nil];

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

    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{

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

    }];

    // 2.创建队列 队列的种类 (1)主队列 (2)非主队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 非主队列

    // NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; // 主队列

    // 最大并发数 maxConcurrentOperationCount = 1 同步操作。 maxConcurrentOperationCount 默认或者其他值的时候异步操作。

    queue.maxConcurrentOperationCount = 1;

    // 添加依赖 可以实现同步执行。因为默认是异步执行的。
    [inOperation01 addDependency:inOperation]; // addDependecy 添加依赖
    // 3. 将任务放到队列中 addOperation
    [queue addOperation:inOperation01]; // addOperation 将任务放入队列中
    [queue addOperation:inOperation];
    [queue addOperation:blockOperation];

    // 如果把 Operation 放到队列中系统会自动管理。否则需要手动启动。
    // [inOperation start];

}
-(void)invocationTest
{
NSLog(@”====%@”,[NSThread currentThread]);
}
-(void)invocationTest01{

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值