iOS—NSOperation、NSOperationQueue简单了解

本文详细介绍了iOS开发中的NSOperation和NSOperationQueue,它们是基于GCD的面向对象封装,提供了更高级别的多线程解决方案。NSOperationQueue允许设置最大并发数、操作依赖和优先级,便于控制执行顺序。文章通过实例展示了如何创建操作、创建队列、添加操作到队列以及使用操作依赖和优先级。同时,对比了NSOperationQueue与GCD的差异,指出NSOperationQueue在处理操作顺序和依赖时更为便捷。
摘要由CSDN通过智能技术生成

NSOperation、NSOperationQueue

NSOperation、NSOperationQueue是苹果提供给我们的一套多线程解决方案。
实际上NSOperation、NSOperationQueue是基于GCD更高一层的封装,完全面向对象。
比GCD更简单易用、代码可读性也更高

为什么要使用NSOperation、NSOperationQueue

  • 可添加完成的代码块,在操作完成之后执行
    NSOperation的completionBlock属性
  • 添加操作之间的依赖关系,方便的控制执行顺序
  • 设定操作执行的优先级
  • 可以很方便的取消一个操作的执行
  • 使用KVO观察对操作执行状态的更改executing、finished、cancelled
    通过KVO的方式移除finished值为yes的NSOperation
  • 可设置最大并发操作数,来控制串行、并行

NSOperation、NSOperationQueue操作和操作队列

NSOperation是基于GCD的更高一层的封装,GCD中的一些概念同样适用于NSOperation、NSOperationQueue。
在NSOperation、NSOperationQueue中也有类似任务(操作)、队列(操作队列)的概念

  • 操作(Operation)
    • 执行操作的意思,就是在线程中执行的那段代码
    • 在GCD中是放在Block中的。在NSOperation中,我们使用NSOperation子类NSInvocationOperation、NSBlockOperation,或者自定义子类来封装操作
  • 操作队列(Operation Queues)
    • 操作队列,即用来存放操作的队列。不同于GCD中的调度队列FIFO(先进先出)的原则。NSOperationQueue对于添加到队列中的操作,首先进入准备就绪的状态(就绪状态取决于与操作之间的依赖关系),然后进入就绪状态的这些操作,开始执行的顺序由操作之间的优先级决定。(优先级是操作对象自身的属性)

NSOperation、NSOperationQueue使用步骤

NSOperation实现多线程的使用步骤分为三步:

  • 创建操作:先将需要执行的操作封装到一个NSOperation对象中
  • 创建队列:创建NSOperationQueue对象
  • 将操作加入到队列中:将NSOperation对象添加到NSOperationQueue对象中

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

NSOperation、NSOperation基本使用

创建操作

NSOperation是个抽象类,不能创建实例,不能用来封装操作。我们只能要他的子线程来封装操作。有三种方式来封装操作。

  • 使用子类NSInvocationOperation
  • 使用子类NSBlockOperation
  • 自定义继承自NSOperation的子类,通过实现内部相应的方法来封装操作
使用子类NSInvocationOperation

在这里插入图片描述

  • 在没有使用NSOperationQueue、在主线程中使用子类NSInvocationOperation执行一个操作的情况下,操作时在当前线程中执行的。并没有开启新线程。
  • 如果在其他线程中执行操作,则打印的结果为其他线程
    在这里插入图片描述
  • 在其他线程中单独使用子类NSInvocationOperation,操作是在这个其他线程中执行的,并没有开启新线程
使用子类NSBlockOperation

在这里插入图片描述

  • 可以看到在没有使用NSOperationQueue、在主线程中单独使用NSBlockOperation执行一个操作的情况下,操作是在当前线程执行的,没有开启新线程。
    当然,如果是在其他线程使用NSBlockOperation执行一个操作,打印结果就为其他线程。同样也没有开启新线程。

NSBlockOperation还有一个方法addExecutionBlock:,通过addExecutionBlock:就可以为NSBlockOperation添加额外的操作。这些操作(包括blockOperationWithBlock中的操作)可以在不同的线程中同时(并发)执行。只有当所有相关的操作已经完成执行时,才视为完成。

如果添加的操作多的话,blockOperationWithBlock:中的操作也有可能会在其他线程(非当前线程)中执行,这是由系统决定的,并不是说添加到blockOperationWithBlock:中的操作一定在当前线程中执行

- (void)useBlockOperation {
   
    
    NSLog(@"%@", [NSThread currentThread]);
    
    //1 创建NSBlockOperation对象
    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
   
        int i = 2;
        while (i--) {
   
            [NSThread sleepForTimeInterval:2];
            NSLog(@"Block task, %@", [NSThread currentThread]);
        }
    }];
    
    //2 添加额外的操作
    [op addExecutionBlock:^{
   
            [NSThread sleepForTimeInterval:2];
            NSLog(@"1--Block task, %@", [NSThread currentThread]);
        }];
    
    [op addExecutionBlock:^{
   
            [NSThread sleepForTimeInterval:2];
            NSLog(@"2--Block task, %@", [NSThread currentThread]);
        }];
    
    [op addExecutionBlock:^{
   
            [NSThread sleepForTimeInterval:2];
            NSLog(@"3--Block task, %@"
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值