iOS多线程于NSOperationQueue和NSOperation

移动硬盘报错0x80070570?5分钟搞定CHKDSK修复(附详细参数说明) 本文针对移动硬盘报错0x80070570问题,提供了详细的CHKDSK修复方法。通过5分钟核心修复流程,指导用户使用系统自带工具快速修复文件系统逻辑错误,恢复硬盘访问。文章还深入解析了CHKDSK参数,并提供了备选数据恢复方案与日常防护建议。 阅读详情

1、一个NSOperation(操作)对象默认是同步执行。若NSOperation添加到一个NSOperationQueue【即操作队列】中去执行,是异步执行。

操作队列为我们提供了两种不同类型的队列:主队列和自定义队列。主队列运行在主线程之上,而自定义队列在后台执行。

操作队列通过设置最大并发操作数(maxConcurrentOperationCount)来控制并发、串行(maxConcurrentOperationCount默认情况下为-1,表示不进行限制,可进行并发执行。为1时,队列为串行队列。只能串行执行。大于1时,队列为并发队列。操作并发执行,当然这个值不应超过系统限制,即使自己设置一个很大的值,系统也会自动调整为最小值)。

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

-1-创建队列:创建 NSOperationQueue 对象。

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

-2-创建操作:先将需要执行的操作封装到一个 NSOperation 对象中。

NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"operation---%@",[NSThread currentThread]);
        
    }];

-3-将操作加入到队列中:将 NSOperation 对象添加到 NSOperationQueue 对象中。

[queue addOperation:operation];

添加一个block形式operation:

[queue addOperationWithBlock:^() {  
    NSLog(@"执行一个的操作,当前线程:%@", [NSThread currentThread]);  

2.NSOperation 是个抽象类,不能用来封装操作。我们只有使用它的子类来封装操作。以下是它的三种封装方式:

-1-使用子类 NSInvocationOperation;

-2-使用子类 NSBlockOperation;

-3-自定义继承自 NSOperation 的子类,通过实现内部相应的方法来封装操作。

2.1、使用子类NSInvocationOperation:

-(void)NSInvocationOperationMethod{
        // 1.创建 NSInvocationOperation 对象
        NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation1) object:nil];
        // 2.开始执行操作
        [operation start];
   
}
//操作1
- (void)operation1 {
    for (int i = 0; i < 2; i++) {
        [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
        NSLog(@"operation1---%@", [NSThread currentThread]);
    }
}
程序运行后输出结果:
可以看出:在没有使用 NSOperationQueue,在主线程中单独使用使用子类 NSInvocationOperation 执行一个操作的情况下,操作是在当前线程执行的,并没有开启新线程。

2.2、使用子类NSBlockOperation:

- (void)NSBlockOperationMethod{
    
    // 1.创建 NSBlockOperation 对象
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 2; i++) {
            [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
            NSLog(@"operation---%@", [NSThread currentThread]);
        }
    }];
    
    // 2.开始执行操作
    [operation start];
}

程序运行后输出结果:


可以看出:和 NSInvocationOperation 使用一样,在没有使用 NSOperationQueue、在主线程中单独使用 NSBlockOperation 执行一个操作的情况下,操作是在当前线程执行的,并没有开启新线程。因为代码是在主线程中调用的,所以打印结果为主线程。如果在其他线程中执行操作,则打印结果为其他线程。

2.3、自定义继承自 NSOperation 的子类【嘤嘤嘤····此处停笔···因为结果是一样的:在没有使用 NSOperationQueue、在主线程单独使用自定义继承自 NSOperation 的子类的情况下,是在主线程中执行操作,并没有开启新线程。】

3、接下来我们直接看看添加多个操作到操作队列中他们的执行顺序是怎样的:

首先先创建操作,将操作加入到创建好的队列中去:

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 创建3个操作
    NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"operationA---%@",[NSThread currentThread]);
        
    }];
    NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"operationB---%@",[NSThread currentThread]);
        
    }];
    NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"operationC---%@",[NSThread currentThread]);
        
    }];

    // 执行操作
    [queue addOperation:a];
    [queue addOperation:b];
    [queue addOperation:c];

程序运行后输出结果:


可以看出是按顺序执行的。

接着我们加入依赖:

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 创建3个操作
    NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"operationA---%@",[NSThread currentThread]);
        
    }];
    NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"operationB---%@",[NSThread currentThread]);
        
    }];
    NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"operationC---%@",[NSThread currentThread]);
        
    }];

    // 添加依赖
    [a addDependency:c];
    [a addDependency:b];
    // 执行操作
    [queue addOperation:a];
    [queue addOperation:b];
    [queue addOperation:c];

程序运行后输出结果:


可以看出A是最后执行的。但是,为什么不是先执行C再执行B呢?因为对于添加到queue中的operations,它们的执行顺序取决于2点:

1.不同于 GCD 中的调度队列 FIFO(先进先出)的原则,首先看看NSOperation是否已经准备好(是否准备好由对象的依赖关系确定);

2.然后再根据所有进入就绪状态的NSOperation的相对优先级来确定(非结束执行顺序)。优先级等级则是operation对象本身的一个属性。默认所有operation都拥有“普通”优先级,不过可以通过setQueuePriority:方法来提升或降低operation对象的优先级。优先级只能应用于相同queue中的operations。如果应用有多个operation queue,每个queue的优先级等级是互相独立的。因此不同queue中的低优先级操作仍然可能比高优先级操作更早执行。

优先级不能替代依赖关系,优先级只是对已经准备好的 operations确定执行顺序。先满足依赖关系,然后再根据优先级从所有准备好的操作中选择优先级最高的那个执行。

哪---在一边写这边文章一边搜罗问题的时候,看到https://www.jianshu.com/p/4b1d77054b35  这篇文~,挺详尽···

--···

【系统分析师】高分论文:论软件开发方法及应用(数据中心CMDB 系统) 【摘要】本文以作者负责的"数据中心CMDB系统"建设项目为例,探讨了系统分析和建模方法在IT项目中的应用实践。项目基于ITIL框架,旨在整合分散的配置信息,构建统一CMDB平台。通过分析结构化、面向对象和构件化三种开发方法特点,项目最终采用结构化分析与V模型结合的方式,并融入面向对象设计理念。系统经过4个月开发后上线,通过增量迭代满足不同数据源接口需求,采用适配器模式提高兼容性。经过2个月试点运行和优化,系统已稳定运行并获得用户认可,为后续IT服务管理集成奠定了基础。项目实施使作者积累了 阅读详情

相关推荐

微信小程序内容安全审核:从API调用到工程化落地的全流程实践

内容安全是互联网应用开发中的基础性技术环节,尤其在用户生成内容(UGC)场景下,它直接关系到平台的合规性与用户体验。其核心原理通常结合了关键词过滤、自然语言处理(NLP)和计算机视觉(CV)等技术,通过AI模型对文本、图像、音频进行多维度风险识别。这项技术的价值在于,它不仅是满足监管要求的必要手段,更是构建健康社区生态、保护品牌声誉、实现产品长期稳定运营的基石,广泛应用于社交、电商、社区论坛等各类UGC平台。本文聚焦于微信小程序生态,深入剖析其官方提供的内容安全解决方案,详细解读如何将文本同步检测与多媒体异

weixin_28622215的博客 452

NSOperationQueue

001两种队列形式:主队列,自定义队列。添加到主队列的NSOperation会放在主线程中执行,放在自定义队列的NSOperation,默认放在子线程并发执行。 002 向NSOperationQueue添加操作 代码实例: - (void)testAddFunction{ NSOperationQueue *mainQueue = [NSOperationQueue currentQueue]; NSOperationQueue *theQueue = [[N

Coding_Physical的专栏 314

手把手教你用AI工具快速开发UniApp首页:从设计稿到完整页面的实战流程

本文详细介绍了如何利用Claude Code、Cursor等AI工具高效开发UniApp首页的完整工作流。从设计稿解析、Prompt工程、代码生成优化到调试适配,提供了一套可复用的实战流程,帮助前端开发者大幅提升从设计到代码的转化效率。

weixin_29199873的博客 317

iOS多线程之NSOperation与NSOperationQueue的使用

NSOperation是常见的多线程方案,是对GCD的封装,采用OC方法,更加面向对象。NSOperation的使用:配合使用NSOperation(任务)和NSOperationQueue(队列)也可以实现多线程。 1、将需要执行的操作封装到一个NSOperation对象中 2、然后将NSOperation对象添加到NSOperationQueue中 3、系统自动将NSOperationQu

Rephontil的博客 3342

从零构建知识图谱:本体工程与知识建模实战指南

本文是一份从零构建知识图谱的实战指南,重点阐述了知识建模与本体工程的核心地位。文章详细介绍了如何使用Protégé工具进行本体设计,包括定义领域、复用现有本体、构建类层次与属性约束,并讲解了如何利用D2RQ工具将关系数据库数据转换为RDF三元组,最终通过Apache Jena Fuseki搭建SPARQL端点进行知识查询与推理,让知识图谱真正“活”起来。

weixin_29057695的博客 571

DSP28335与Vofa+上位机通信实战:SCIb配置避坑指南(附完整代码)

本文提供DSP28335与Vofa+上位机通信的实战指南,重点解析SCIb模块配置的常见问题与解决方案。针对研旭开发板的硬件连接、波特率精确计算、FIFO高效使用以及FireWater协议封装进行了详细说明,并附有完整代码,帮助开发者快速实现实时数据可视化与波形分析,提升调试效率。

weixin_29172963的博客 150

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

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

毛毛虫 1961

一文搞定学术英语写作 (斯坦福SCI论文写作课程笔记)

0.前言: 本文基于斯坦福Kristin Sainani 教授的学术论文写作公开课——SCI论文写作(Writing in the Sciences)。在此基础上进行章节顺序的重排及部分内容的删减,以方便第一次进行英语学术论文写作的同学快速上手。 时间充足和想要系统学习英文学术写作的同学,十分建议观看完整课程视频,一定会受益匪浅!课程地址如下: 课程B站地址:https://www.bilibili.com/video/BV1zv41177JQ 1.论...

Ogmx的博客 3万+

ios多线程之NSOperation和NSOperationQueue

NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 1、NSOperation和NSOperationQueue实现多线程的具体步骤 2、先将需要执行的操作封装到一个NSOperation对象中 3、然后将NSOperation对象添加到NSOperationQueue中 4、系统会自动将NSOperatio...

azyiytn69263的博客 167

51单片机IAP技术详解:从原理到实战,实现远程程序自更新

在嵌入式系统开发中,程序更新是产品维护和功能迭代的核心需求。传统方式依赖外部烧录器,操作繁琐且无法远程进行。IAP(在应用中编程)技术则从原理层面解决了这一难题,它允许单片机在运行过程中通过特定接口(如串口)动态修改自身的Flash程序存储器。这项技术的核心价值在于赋予设备远程升级和自主维护的能力,极大地延长了产品生命周期并降低了维护成本。其典型应用场景包括智能家居控制器、工业数据采集模块和远程仪表等部署后不便拆卸的设备。本文以经典的51单片机(如STC89C52)为例,深入剖析IAP的实现,其中Bootl

weixin_29161719的博客 406

【实践】VECTOR AUTOSAR创建SWC读写CAN信号

在AUTOSAR开发中最必要的功能就是读写CAN信号,本文通过一步步说明,介绍如何开发SWC来读写CAN信号,可以说在AUTOSAR中实现读写CAN信号的实践过程,是一个非常基础且典型的练习。在本篇文章阅读之前,推荐阅读AUTOSAR RTE介绍,本篇文章介绍了RTE的比较全面的介绍了AUTOSAR RTE。理解了RTE之后,才能对SWC的设计更加清楚。话不多说,接着上一篇内容VECTOR DaVinci从0到1搭建工程,此篇文章我们介绍如何在DaVinci Developer中开发SWC访问CAN信号。为

酒无忧的博客 1231

[转] iOS多线程编程之NSOperation和NSOperationQueue的使用

《iOS多线程编程之NSThread的使用》 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用。 使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation。 另一种是继承NSOperation 如果你也熟悉Java,NSOperation就和java.l...

weixin_33941350的博客 216

RT-DETR算法优化改进:DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测

DCNv4更快收敛、更高速度、更高性能,完美和RT-DETR结合,助力涨点

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1323

【iOS】—— 多线程NSOperation和NSOperationQueue

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

qq_72437394的博客 1018

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

iOS多线程编程之NSOperation和NSOperationQueue的使用

iOS多线程编程之NSOperation和NSOperationQueue的使用 使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation。 另一种是继承NSOperation 如果你也熟悉Java,NSOperation就和java.lan

binyanye1的专栏 812

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IOS多线程编程之NSOperation和NSOperationQueue的使用

[+] 前一篇  IOS多线程编程之NSThread的使用 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用。 使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation。 另一种是继承NSOperation 如果你也熟悉Java,NSOperati

jackljf的专栏 575

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: 打开Charles,提示:您需要安装旧 Java SE 6 运行环境才能打开“Charles”。
下一篇: iPhone5上真机测试问题: Showing Recent Issues clang: error: linker command failed with exit code 1
麦兜的胖肚肚
博客等级 码龄11年 29粉丝 39原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值