ios多线程 -- NSOperation 简介

NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程
NSOperation和NSOperationQueue实现多线程的具体步骤:
1)先将需要执行的操作封装到一个NSOperation对象中
2)然后将NSOperation对象添加到NSOperationQueue中
3)系统会⾃动将NSOperationQueue中的NSOperation取出来
4)将取出的NSOperation封装的操作放到⼀条新线程中执⾏

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

NSInvocationOperation 开启任务方法

//用 NSInvocationOperation 创建线程NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download:) object:@"NSInvocationOperation"];
//在当前线程中同步执行
[invocation start];- (void)download:(NSString *)url{NSLog(@"%@ --- %@", [NSThread currentThread], url);
}

同步

将创建的任务添加到队列中,异步执行

- (void)invocationOperation{//用 NSInvocationOperation 创建线程NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download:) object:@"NSInvocationOperation"];  //创建全局队列(实现异步并发执行)NSOperationQueue *queue = [[NSOperationQueue alloc] init];//从对列中取出任务执行(异步)[queue addOperation:invocation];}- (void)download:(NSString *)url{NSLog(@"%@ --- %@", [NSThread currentThread], url);
}

异步
注意:操作对象默认在主线程中执行,只有添加到队列中才会开启新的线程。即默认情况下,如果操作没有放到队列中queue中,都是同步执行。只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作

NSBlockOperation 开启任务的方法

NSBlockOperation 添加任务
- (void)blockOperation2{//创建任务NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"下载图片1 --- %@", [NSThread currentThread]);}];[operation1 start];
}

这里写图片描述

注意:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作

- (void)blockOperation2{//注意:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作//创建任务NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"下载图片1 --- %@", [NSThread currentThread]);}];[operation1 addExecutionBlock:^{NSLog(@"下载图片2 --- %@", [NSThread currentThread]);}];[operation1 addExecutionBlock:^{NSLog(@"下载图片3 --- %@", [NSThread currentThread]);}];[operation1 start];
}

这里写图片描述

NSOperationQueue

NSOperationQueue的作⽤:NSOperation可以调⽤start⽅法来执⾏任务,但默认是同步执行的
如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作
添加操作到NSOperationQueue中,自动执行操作,自动开启线程
获取 NSOperationQueue 队列:

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];//并发队列NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];//主队列

添加任务有两个方法:

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

实例代码

- (void)blockOperation{//创建全局队列(实现异步并发执行)NSOperationQueue *queue = [[NSOperationQueue alloc] init];//并发队列//NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];//主队列//创建任务NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"下载图片1 --- %@", [NSThread currentThread]);}];NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"下载图片2 --- %@", [NSThread currentThread]);}];NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"下载图片3 --- %@", [NSThread currentThread]);}];NSBlockOperation *operation4 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"下载图片4 --- %@", [NSThread currentThread]);}];NSBlockOperation *operation5 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"下载图片5 --- %@", [NSThread currentThread]);}];//将任务添加到队列中[queue addOperation:operation1];[queue addOperation:operation2];[queue addOperation:operation3];[queue addOperation:operation4];[queue addOperation:operation5];
}

这里写图片描述

- (void)queueAddBlock{//创建全局队列(实现异步并发执行)NSOperationQueue *queue = [[NSOperationQueue alloc] init];//直接向队列中添加任务[queue addOperationWithBlock:^{NSLog(@"下载图片1 --- %@", [NSThread currentThread]);}];[queue addOperationWithBlock:^{NSLog(@"下载图片2 --- %@", [NSThread currentThread]);}];[queue addOperationWithBlock:^{NSLog(@"下载图片3 --- %@", [NSThread currentThread]);}];[queue addOperationWithBlock:^{NSLog(@"下载图片4 --- %@", [NSThread currentThread]);}];[queue addOperationWithBlock:^{NSLog(@"下载图片5 --- %@", [NSThread currentThread]);}];
}

这里写图片描述

转载于:https://www.cnblogs.com/xiaocai-ios/p/7779775.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在没有复杂插件的情况下从Eclipse启动和调试Tomcat

像Eclipse这样的现代IDE提供了各种插件来简化Web开发。 但是,我相信将Tomcat作为“常规” Java应用程序启动仍然可以提供最佳的调试体验。 大多数时候,这是因为这些工具将Tomcat或任何其他servlet容器作为外部进程启动,然后在其上附加一个远程…

Lucene分析过程指南

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中,以…

【javascript高级教程】JavaScript Number 对象

JavaScript 只有一种数字类型。可以使用也可以不使用小数点来书写数字。 var pi3.14; // 使用小数点 var x34; // 不使用小数点 极大或极小的数字可通过科学(指数)计数法来写: var y123e5; // 12300000 var z123e-5; // 0.0…

【javascript高级教程】JavaScript 字符串(String) 对象

String 对象用于处理已有的字符块。 JavaScript 字符串 一个字符串用于存储一系列字符就像 "John Doe". 一个字符串可以使用单引号或双引号: var carname"Volvo XC60"; var carnameVolvo XC60; 你使用位置(索引)可以…

Chrome 开发工具之Network

经常会听到比如"为什么我的js代码没执行啊?","我明明发送了请求,为什么反应?","我这个网站怎么加载的这么慢?"这类的问题,那么问题既然存在,就需要去解决它,需要…

实用常识_实用垃圾收集,第1部分–简介

实用常识这是我打算写的一系列博客文章的第一部分,其目的是解释垃圾回收在现实世界中如何工作(尤其是在JVM中 )。 我将介绍一些我认为对于充分理解垃圾收集对于实际目的是必需的理论,但是将其降至最低。 其动机是在各种情况下&…

重写AgileEAS.NET SOA 中间件平台账号密码的加密算法

一、平台简介 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市…

Java中的堆栈安全递归

在本文中,摘自《 Java中的函数式编程 》一书,我解释了如何使用递归,同时避免了StackOverflow异常的风险。 Corecursion正在使用第一步的输出作为下一步的输入来构成计算步骤。 递归是相同的操作,但是从最后一步开始。 在这种情况…

数字化经营支付3.0有哪些盈利机会

实体商户的现状 服务商经营现状 官方政策支持 微信平台通过多渠道助力商户发放 优惠券,如扫码领券、API领券、支 付有礼、附近3公里等形式,给商户 做引流拓客。

nessus重置密码

许久不用的nessus密码居然忘记了,查了下: cmd下进入到nessus的安装目录 提升为管理员,登录系统 如果想用之前的账号,可以直接在系统内重置密码。转载于:https://www.cnblogs.com/nayu/p/5640527.html

程序员有哪些可以写博客的网站?

俗话说:好记性不如烂笔头,作为一名合格的程序员还是抽时间写写博客的,马云曾说“成功的人有两个特质,一个是喜欢写作,一个是喜欢演讲”,我觉得吧,写作一是为了总结,二是督促自己成长…

工厂方法设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

jmx jolokia_使用Jolokia和JMX进行客户端服务器监视

jmx jolokiaJava监视工具的选择非常广泛(由Google提供的随机选择和顺序): javamelody 压力探头 JVisualVM 控制台 贾蒙 Java JMX Nagios插件不适用 此外,还有各种专用工具,例如ActiveMQ , JBoss &…

利用 %20 替换 空格

将字符串中的空格都替换为 %20 &#xff08; 时间复杂度为O&#xff08;N&#xff09;的解法 &#xff09; void ReplaceBlankSpace(char* arr){if (arr){int count 0;int lenth strlen(arr);for (int i 0; i < lenth;i)if (arr[i] )count;char*before arrlenth, *beh…

Node.js 官方文档中文版

这目录也是醉了 。 列出跟没列出没两样 转载于:https://www.cnblogs.com/ganmk--jy/p/5646860.html

Smaug Coverage

转载于:https://www.cnblogs.com/edisonxiang/p/5650656.html

图谱(学习地图)系列总结,持续更新中

目录 1.2022年最新前端学习路线图 2.2022年最新大数据学习路线图 3.2022年最新javaEE学习路线图 4.2022年最新UI/UE学习路线图 5.2022年java学习路线指南 6.JavaScript学习总结&#xff08;思维导图篇&#xff09; 7.思维脑图——数据分析实战&#xff08;最新版&#…

ccxt k线数据_寻找相似的历史k线

有网友提问应该用什么样的数据库/数据结构/算法来计算某支股票的相似K线? 具体的问题描述是&#xff0c;假设给出某股某段行情K线&#xff08;单位/日&#xff09;&#xff0c;从任何其他股票历史中匹配出与之最为相似的某段历史K线&#xff0c;并给出相似度值&#xff08;单位…

k均值例子 数据挖掘_数据挖掘的技术有很多种,常用的数据挖掘技术就这13种...

数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的数据中&#xff0c;提取隐含在其中的、人们事先不知道的但又是潜在有用的信息和知识的过程。数据挖掘的任务是从数据集中发现模式&#xff0c;可以发现的模式有很多种&#xff0c;按功能可以分为两大类&#xff1a;预…

【TypeScript系列教程05】保留关键字

目录 TypeScript 保留关键字 TypeScript 保留关键字 TypeScript 保留关键字如下表所示&#xff1a;