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容器作为外部进程启动,然后在其上附加一个远程…

【javascript高级教程】JavaScript 对象

JavaScript 中的所有事物都是对象:字符串、数值、数组、函数...及自定义对象 JavaScript 提供多个内建对象,比如 String、Date、Array 等等。 对象只是带有属性和方法的特殊数据类型。 布尔型可以是一个对象。数字型可以是一个对象。字符串也可以是一个…

php 字符串函数

函数名描述实例输入输出trim()删除字符串两端的空格和其他预定义字符 $str"\r\nHello\r\n"; echo trim($str) 目标字符串 清除后的字符串 rtrim()/chop() 删除字符串右边的空格或其他预定义字符 ltrim() 删除字符串左边的空格或其他预定义字符 …

Lucene分析过程指南

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

【JavaScript高级教程】JavaScript prototype(原型对象)

所有的 JavaScript 对象都会从一个 prototype(原型对象)中继承属性和方法。 function Person(first, last, age, eyecolor) {this.firstName first;this.lastName last;this.age age;this.eyeColor eyecolor; }var myFather new Person("John…

【javascript高级教程】JavaScript Number 对象

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

【leetcode】clone-graph

写在前面的话: 看了看自己的博客,从一月底开始就没怎么更新过,我也确实将近5个月没怎么写代码了。今天突然觉得有些心慌,感觉手都已经生疏了。果然,随便找了道题就卡住了。隐约感觉要用map但又不太记得用法了&#xff…

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

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

Redis教程:NoSQL键值存储

课程大纲 Redis是使用ANSI C编写的具有可选持久性的开源,网络化,内存中键值数据存储。根据DB-Engines.com的月度排名,Redis是最受欢迎的键值存储。 它的名字意思是远程字典服务器。 Redis已获得BSD许可,并且通常被称为数据结构服…

java 里面eaquls和==区别

java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(),比较的是他们的值。 2.复合数据类型(类) 当他们用…

【javascript高级教程】JavaScript Array(数组) 对象

数组对象的作用是:使用单独的变量名来存储一系列的值。 创建数组, 为其赋值: var mycars new Array(); mycars[0] "Saab"; mycars[1] "Volvo"; mycars[2] "BMW"; 什么是数组? 数组对象是使用单独的变量名来存储一…

Chrome 开发工具之Network

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

【javascript高级教程】JavaScript Date(日期) 对象

日期对象用于处理日期和时间。 创建日期 Date 对象用于处理日期和时间。 可以通过 new 关键词来定义 Date 对象。以下代码定义了名为 myDate 的 Date 对象: 有四种方式初始化日期: new Date(); new Date(value); new Date(dateString); new Date(year, monthI…

实用常识_实用垃圾收集,第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

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

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

微信支付 h5

Android开发要点说明 商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。 应用包名:是在APP项目配置文件And…