iOS多线程开发之NSOperation用法总结-----经典

iOS多线程——你要知道的NSOperation都在这里 你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里转载请注明出处 http://www.jianshu.com/p/bf0916ee1492本系列文章主要讲解iOS中多线程的使用,包括:NSThread、GCD、NSOperation以及RunLoop的使用方法详解,本系列文章不涉及基础的线程/进程、同步/异步、阻塞/非阻塞、串行/并行,这些基础概念,有不 阅读详情

NSOperation的作用,转载地址http://www.jianshu.com/p/b2a7c985df3e

配合使用NSOperation和NSOperationQueue也能实现多线程编程

NSOperation和NSOperationQueue实现多线程的具体步骤

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

注意:

  • NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类
  • 使用NSOperation子类的方式有3种:
    • NSInvocationOperation
    • NSBlockOperation
    • 自定义子类继承NSOperation,实现内部相应的方法

NSInvocationOperation类

  • 创建NSInvocationOperation对象
    -(id)initWithTarget:(id)targetselector:(SEL)selobject:(id)arg;
  • 调用start方法开始执行操作
    -(void)start;
    一旦执行操作,就会调用target的sel方法
  • 代码:

    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
      [op start];
    - (void)run
    {
      NSLog(@"------%@", [NSThread currentThread]);
    }
  • 注意:

    • 默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作
    • 只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作
    • 此类仅当了解,在开发中并不常用

NSBlockOperation类

  • 创建NSBlockOperation对象
    +(id)blockOperationWithBlock:(void(^)(void))block;
  • 通过addExecutionBlock:方法添加更多的操作
    -(void)addExecutionBlock:(void(^)(void))block;
  • 代码:

    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
          // 在主线程
          NSLog(@"下载1------%@", [NSThread currentThread]);
      }];
    
      // 添加额外的任务(在子线程执行)
      [op addExecutionBlock:^{
          NSLog(@"下载2------%@", [NSThread currentThread]);
      }];
      [op addExecutionBlock:^{
          NSLog(@"下载3------%@", [NSThread currentThread]);
      }];
      [op addExecutionBlock:^{
          NSLog(@"下载4------%@", [NSThread currentThread]);
      }];
    
      [op start];
  • 注意:只要NSBlockOperation封装的操作数 >1,就会异步执行操作

NSOperationQueue

  • NSOperationQueue的作用

    • NSOperation可以调用start方法来执行任务,但默认是同步执行的
    • 如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作
  • 添加操作到NSOperationQueue中

    -(void)addOperation:(NSOperation*)op;
    -(void)addOperationWithBlock:(void(^)(void))block;
  • 代码:

    • 方法一:

      // 创建队列
      NSOperationQueue *queue = [[NSOperationQueue alloc] init];
      
      // 创建操作
          NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
              NSLog(@"download1 --- %@", [NSThread currentThread]);
          }];
      
      //添加操作到队列中
          [queue addOperation:op1];
    • 方法二:
      // 创建队列
      NSOperationQueue *queue = [[NSOperationQueue alloc] init];
      //添加操作到队列中
      [queue addOperationWithBlock:^{
          NSLog(@"download1 --- %@", [NSThread currentThread]);
      }];

NSOperationQueue的队列类型与GCD的队列类型对比

  • GCD的队列
    • 并发队列
      • 自己创建的
      • 全局
    • 串行队列
      • 主队列
      • 自己创建的
  • NSOperationQueue的队列
    • 主队列
      [NSOperationQueue mainQueue]
      • 凡是添加到主队列中的任务(NSOperation),都会放到主线程中执行
    • 非主队列(其他队列)
       [[NSOperationQueue alloc] init]
      • 同时包含了:串行、并发功能
      • 添加到这种队列中的任务(NSOperation),就会自动放到子线程中执行

最大并发数

  • 什么是并发数

    • 同时执行的任务数
    • 比如,同时开3个线程执行3个任务,并发数就是3
  • 最大并发数的相关方法

    -(NSInteger)maxConcurrentOperationCount;
    -(void)setMaxConcurrentOperationCount:(NSInteger)cnt;
  • 代码

     // 创建队列
     NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
     // 设置最大并发操作数
     // queue.maxConcurrentOperationCount = 2;// 并发队列
     queue.maxConcurrentOperationCount = 1; // 就变成了串行队列
     // 添加操作
     [queue addOperationWithBlock:^{
          NSLog(@"download1 --- %@", [NSThread currentThread])
      }];
     [queue addOperationWithBlock:^{
          NSLog(@"download2 --- %@", [NSThread currentThread])
      }];
     [queue addOperationWithBlock:^{
          NSLog(@"download3 --- %@", [NSThread currentThread])
      }];

队列的取消、暂停、恢复

  • 取消队列的所有操作

    -(void)cancelAllOperations;

    提示:也可以调用NSOperation的-(void)cancel方法取消单个操作

  • 暂停和恢复队列

    -(void)setSuspended:(BOOL)b;// YES代表暂停队列,NO代表恢复队列
    - (BOOL)isSuspended
  • 代码

    // 恢复队列,继续执行
    // self.queue.suspended = NO;
    
    // 暂停(挂起)队列,暂停执行
    // self.queue.suspended = YES;
    
    // 取消队列的所有操作
    [self.queue cancelAllOperations];

操作依赖

  • NSOperation之间可以设置依赖来保证执行顺序
    • 比如一定要让操作A执行完后,才能执行操作B,可以这么写
      [operationB addDependency:operationA];// 操作B依赖于操作A
  • 也可以在不同queue的NSOperation之间创建依赖关系
  • 代码
      // 创建队列
      NSOperationQueue *queue = [[NSOperationQueue alloc] init];
      // 添加操作
      NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
          NSLog(@"download1----%@", [NSThread  currentThread]);
      }];
      NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
          NSLog(@"download2----%@", [NSThread  currentThread]);
      }];
      NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
          NSLog(@"download3----%@", [NSThread  currentThread]);
      }];
     // 设置依赖(保证op3在op1和op2都执行完之后再执行)
      [op3 addDependency:op1];
      [op3 addDependency:op2];
  • 注意:不能相互依赖
    • 比如A依赖B,B依赖A

线程之间的通信

  • 举例:在子线程下载图片,再回答到主线程在imageView添加图片
  • 看代码:
   [[[NSOperationQueue alloc] init] addOperationWithBlock:^{
        // 图片的网络路径
        NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];

        // 加载图片
        NSData *data = [NSData dataWithContentsOfURL:url];

        // 生成图片
        UIImage *image = [UIImage imageWithData:data];

        // 回到主线程
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            self.imageView.image = image;
        }];
    }];

操作的监听

  • 可以监听一个操作的执行完毕
    -(void(^)(void))completionBlock;
    -(void)setCompletionBlock:(void(^)(void))block;

自定义NSOperation

  • 自定义NSOperation的步骤很简单
    • 重写-(void)main方法,在里面实现想执行的任务
  • 重写-(void)main方法的注意点
    • 自己创建自动释放池(因为如果是异步操作,无法访问主线程的自动释放池)
    • 经常通过-(BOOL)isCancelled方法检测操作是否被取消,对取消做出响应
【iOS】NSOperation NSOperation 是居于objective-c对GCD封装居于面向对象的,线程执行方式;NSOperation配合NSOperationQueue也能实现多线程编程;先将需要执行的操作封装到一个NSOperation对象中然后将NSOperation对象添加到NSOperationQueue中将取出的NSOperation封装的操作放到一条新线程中执行。 阅读详情

相关推荐

iOS并发编程实践:NSOperation深入解析

本文还有配套的精品资源,点击获取 简介:在iOS开发中,掌握多线程技术是核心技能之一。本源码包"NSOperationTest"提供了一个深入研究NSOperation及其相关概念的实践平台。NSOperation是苹果公司提供的一个高级多任务处理框架,基于GCD之上,允许开发者方便地管理和控制任务执行。通过此项目,开发者可以学习如何使用NSOperation和NSOper...

weixin_36178216的博客 1288

iOS多线程编程NSOperation和NSOperationQueue的使用总结

一、队列里可以加入很多个NSOperation, 可以把NSOperationQueue看作一个线程池,可往线程池中添加操作(NSOperation)到队列中。线程池中的线程可看作消费者,从队列中取走操作,并执行它。1、主队列:添加到主队列的操作,都会放到主线程中执行。

程序猿老樊的博客 1335

手把手教你复现IEEE 2025高光谱图像盲超分算法DBSR(附开源代码与避坑指南)

本文详细介绍了如何从零复现IEEE 2025高光谱图像盲超分算法DBSR,包括环境配置、数据预处理、核心模块解析、训练策略及常见问题解决方案。特别针对开源代码中的关键步骤和潜在问题提供了实用指南,帮助研究者和开发者高效实现Deep blind super-resolution技术,适用于遥感、医疗等领域的图像增强应用。

weixin_42524708的博客 413

【iOS】多线程NSOperation,NSOperationQueue

前段时间学习了有关于GCD的内容,这段时间对于的内容再进行一个学习和总结实际上是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。需要配合来实现多线程。操作的定义:执行操作的含义,换句话说其实就是在线程中执行的那段代码,从GCD层面来类比就相当于我们的一个block在中,我们可以采用他的子类来进行一个封装的操作操作队列:这里的队列是值操作队列,就是用来存放操作的队列.不同于GCD中的一个调度队列的FIFO。

qq_73106050的博客 1505

threejs开发可视化数字城市效果

theme: condensed-night-purple 灵感图 现在随着城市的发展,越来越多的智慧摄像头,都被互联网公司布到城市的各个角落,举一个例子,一个大楼上上下下都被布置了智能摄像头,用于监控火势,人员进出,工装工牌佩戴等监控,这时候为了美化项目,大公司都会将城市的区域作为对象,进行3d可视化交互,接下来的内容,就是基于以上元素,开发的一款城市数据可视化的demo,包含楼宇特...

weixin_41770018的博客 1579

PLSQL Developer新手必看:如何避免安装过程中的常见坑

本文为PL/SQL Developer新手提供了详尽的安装与配置避坑指南。从版本选择、注册码使用、汉化包安装到Oracle客户端连接配置,逐一解析常见问题并提供解决方案,帮助开发者快速搭建稳定的PL/SQL开发环境,顺利开启Oracle数据库编程工作。

g9h0i1的博客 651

iOS多线程技术2 - NSOperation和NSOperationQueue的详细用法

NSOperation 和 NSOperationQueue 是苹果提供的一套多线程解决方案,是基于 GCD 的封装,完全面向对象,代码可读性较高。 NSOperation NSOperation 是一个抽象类,并不具备封装操作的能力,用作父类用来约束子类,要想封装操作,必须使用它的子类。 我们可以使用系统提供的两个子类 NSBlockOperation 和 NSInvocationOperati...

毛毛虫 1961

深度解析跨境支付之业务架构

详解跨境支付之业务架构

weixin_47493863的博客 1877

iOS 多线程开发之OperationQueue(二)NSOperation VS GCD

原创Blog,转载请注明出处 blog.youkuaiyun.com/hello_hwc欢迎关注我的iOS SDK详解专栏 http://blog.youkuaiyun.com/column/details/huangwenchen-ios-sdk.html前言:最近有点忙,所以这个月更新的博客数量有些下降,估计这个月和下个月博客更新的数量都在10篇左右。回到正题,本文会比较下GCD和NSOperation两种多线程的

Leo的专栏 3927

【Qt】Qt5.15在线安装避坑指南:从代理配置到组件选择的完整实践

本文详细介绍了Qt5.15在线安装的全流程避坑指南,包括代理配置、组件选择和常见问题解决方案。通过使用Fiddler工具和国内镜像源,可显著提升下载速度。文章还提供了组件选择的黄金法则和安装后的验证步骤,帮助开发者高效完成Qt5.15的安装与配置。

weixin_42550052的博客 270

光模块组成

时钟恢复电路(Clock Data Recovery,简称CDR)是光模块中的关键组成部分,CDR的作用主要是从接收到的信号中提取出数据序列,并且恢复出与数据序列相对应的时钟时序信号,从而还原接收到的具体信息。因为光信号传输至一定距离的时候,通常是长距离传输,其波形会出现一定程度的失真,接收端接收到的信号是一个个长短不一的脉冲信号,这个时候在接收端,我们就无法得到我们需要的数据。所以,这个时候就需要有信号的再生,信号的再生功能为再放大、再整形和再定时,其中的再定时指的就是CDR时钟数据恢复。

han_better的博客 5721

iOS开发 自定义NSOPeration

iOS多线程开发中,NSOperation是我们经常使用的,有时系统自带的两个类NSInvocationOperation和NSBlockOperation不能满足我们的需求时就需要我们自定义。 自定义NSOperation分两种,一种是自定义非并发的NSOperation,一种是定义并发的NSOperation的。下面分别介绍。 一:定义非并发的NSOperation。 定义非并发的NSO

MrZhao的博客 4640

复现CVE-2014-085(Apache ZooKeeper 未授权访问漏洞)

默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据。

记录并分享学习安全的知识点.. 2175

iOS 多线程之NSOperation

级别: ★★☆☆☆ 标签:「iOS」「多线程」「NSOperation」 作者: dac_1033 审校: QiShare团队 上一篇介绍了NSThread,本篇将介绍“iOS多线程之NSOperation”。 一、线程池 多线程处理任务的过程中,频繁的创建/销毁线程会很大程度上影响处理效率,新起的线程数过多会降低系统性能甚至引起app崩溃。在Java和C#开发过程中可以使用线程池来解决这些问...

weixin_34270865的博客 161

2021-09-29 每天几个LCEDA小知识——如何交叉选择并阵列放置元器件

立创EDA专业版之交叉选择并阵列放置元器件????交叉选择????阵列放置 ????交叉选择 在原理图界面,先框选需要交叉选择的元器件对象,右键,选择交叉选择(如果熟练之后,直接选择元器件,快捷键Shift+X)。 完成上述操作之后,可以看到自动跳转到PCB绘图界面,并自动选定PCB中相关的元器件,接下来不要取消选择的状态,在相关元器件被选中的情况下,即可开展阵列放置,将这些元器件都放在一个区域,方便PCB画线前的布局工作。 ????阵列放置 在布局菜单栏中,选择分布,选择阵列分布, 在弹出的对话框

l64481000的博客 1463

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

iOS多线程编程——浅谈NSOperation

就如同上一篇文章——《iOS多线程编程——浅谈GCD》中写到的,iOS的多线程开发中,最常用的就是NSThread,NSOperation,GCD,他们的抽象层次从左往右越来越高,这也就是越来越底层,性能也就越来越好。既然上次谈到了GCD,那么这次就不得不来谈谈他的兄弟NSOperation。

zkh90644的博客 893

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

iOS开发之多线程——NSThread、NSOperation、GCD

一、概述 1、NSThread 优点:轻量级,使用简单; 缺点:需要自己管理线程的生命周期、线程同步,线程同步时对数据加锁会造成系统额外的开销。且难以控制线程的执行顺序和并发数量。 使用方法: ①、类方法:+(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)obj,该方法创建线程并

chy305chy的专栏 497

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【iOS】NSOperation、NSOperationQueue

寒假学习了GCD,前几天学习了NSThread,今天来学习iOS 多线程中 NSOperation、NSOperationQueue 的相关知识以及使用方法。是苹果提供给我们的一套多线程解决方案。实际上 NSOperation是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。需要配合来实现多线程。

weixin_72437555的博客 1708

iOS开发-iOS多线程开发中踩过的坑-GCD的特性-NSOperation线程依赖-iOS多线程踩坑小结

本期内容: iOS开发中从其他线程回到主线程的方法 dispatch_group_create 组的概念 dispatch_sync同步调度主线程会死锁的原因 项目中什么时候选择GCD什么时候选择NSOperation NSOperation 线程依赖的简单例子 GCD的计时器和延时执行 简单说说线程死锁和线程安全⭐️ iOS开发中从其他线程回到主线程的方法 在开发中我们经常使用简单的多线程...

伪随机的张三 1495

iOS多线程开发系列之(二)NSOperation

上一篇我们简单的对iOS多线程开发系列(一)三种多线程办法进行对比性能和操作的复杂度,并认真介绍了NSThread的使用。 我们借助上一次的例子完全可以采取NSOperation方法进行实现NSOperation不具备封装操作的能力,必须使用它的子类: NSInvocationOperation NSBlockOperation 更简洁的Block实现方法,功能上与 NSInvocationOpe

小王的技术窝 1287

iOS多线程网络之NSOperation

前面介绍了多线程中常用的GCD,链接:iOS多线程网络之GCD,这次介绍一下多线程网络中的另一个好用的技术NSOperation 简介 NSOperation和GCD差不多,但是NSOperation更加的面向对象,相当于对GCD的一个封装,NSOperation本身是一个抽象类,不具有封装操作的能力,即定义一个NSOperation对象不能进行多线程操作,要想实现操作,必须要使用到它的子类:

滴水穿石,慢慢积累,总会有成果 532

iOS多线程【NSOperation】总结

Demo链接:https://github.com/asd521411/NSOperationDemo.git 本文用来介绍 iOS 多线程中 NSOperation、NSOperationQueue 的相关知识以及使用方法。 通过本文,您将了解到: NSOperation、NSOperationQueue 简介、操作和操作队列、使用步骤和基本使用方法、控制串行/并发执行、NSOperatio...

草帽~小子^的博客 359

iOS之多线程开发(NSThread,NSOperation,GCD)

今天闲来无事,就来总结一下iOS中的多线程开发吧。iOS有三种多线程编程的技术,分别是:1.NSThread------每个NSThread对象对应一个线程,量级较轻(真正的多线程)2.NSOperation------NSOperation/NSOperationQueue 面向对象的线程技术3.GCD------Grand Central Dispatch(派发) 是基于C语言的框架,可以充分...

等待化茧成蝶的专栏 1459

IOS多线程(NSThread,NSOperation,Grand Central Dispatch)

文档转自:http://www.cnblogs.com/BinShao/p/zhibin.html •NSThread:   –优点:NSThread 比其他两个轻量级,使用简单   –缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销   •NSOperation:    –不需要关心线程管理,数据同步的事

decemberd的专栏 1万+

iOS多线程之NSOperation详解

使用NSOperation和NSOperationQueue进行多线程开发,只要将一个NSOperation(实际开发中需要使用其子类 NSInvocationOperation,NSBlockOperation)放到NSOperationQueue这个队列中线程就会依次启动。NSOPerationQUeue负责管理,执行所有的NSOPeration。在这个过程中可以更加容易管理线程的总...

ddiv24492的博客 165

[笔记]iOS开发之多线程GCD和NSOperation基本使用

在iOS开发中多线程技术常用的就是GCD和NSOperation,以下介绍这两种的基本使用. GCD:     GCD的基本概念           同步函数 sync (不管是串行队列还是并行队列还是主队列,都不会开启新线程)           异步函数 async (串行队列和并行队列下会开启新线程)           GCD会自动的

Yuzee的博客 961
上一篇: 轮播器
下一篇: 队列和线程的关系
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值