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

ios多线程 -- NSOperation 简介相关推荐

  1. ios 多线程 -- NSOperation 常用方法

    1 最大并发数 最大并发数:同一时间最多只能执行的任务的个数. 最⼤大并发数的相关⽅方法 - (NSInteger)maxConcurrentOperationCount; - (void)setMa ...

  2. iOS多线程:『NSOperation、NSOperationQueue』详尽总结

    2019独角兽企业重金招聘Python工程师标准>>> iOS多线程:『NSOperation.NSOperationQueue』详尽总结 转载: 原地址https://www.ji ...

  3. iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(下)

    2017-07-08 remember17 Cocoa开发者社区 7NSOperation的理解与使用 No.1:NSOperation简介 NSOperation是基于GCD之上的更高一层封装,NS ...

  4. iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)

    2017-07-08 remember17 Cocoa开发者社区 目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 ...

  5. iOS面试题(二十五)多线程 --NSOperation和NSOperationQueueNSThread锁机制

    7.多线程 GCD(使用最多) NSOperation/NSOperationQueue(AFNetworking源码中所有网络请求任务都封装到NSOperation,提交到operationQueu ...

  6. iOS 多线程的四种技术方案

    iOS 多线程的四种技术方案 image pthread 实现多线程操作 代码实现: void * run(void *param) {for (NSInteger i = 0; i < 100 ...

  7. iOS多线程编程之NSThread的使用(★★★推荐,为原作者点赞★★★)

    文章来源:http://blog.csdn.net/totogo2010/article/details/8010231 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThre ...

  8. IOS多线程开发详解

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

  9. 【iOS】NSOperation

    参考博客:NSOperation简介 [iOS]NSOperation, NSOperationQueue NSOperation的简单介绍 NSOperation 是居于objective-c对GC ...

最新文章

  1. “为啥Kaggle奖金那么少?”一场25000美元的比赛,却因“抠门”引发激烈讨论...
  2. Python 技术篇-百度语音合成SDK接口调用演示
  3. java获得当前文件路径
  4. 模型存储在哪里_最强的模型工作收纳站「Artty Station」登场!
  5. 批量刷新远程物化视图的方法(备用)
  6. Android权威编程指南读书笔记(1-2章)
  7. 《国民经济行业分类GB/T 4754—2017》官网下载地址
  8. redhat7linux防火墙开放端口,Redhat7 firewall(防火墙)
  9. synergy 控制客户端电脑很卡_Synergy 一套键鼠同时控制多台电脑的神器!超级方便!(开源免费,支持Win/Mac/Linux)...
  10. Android开发跳坑之路
  11. EXCEL 数据比对查询好用的指令——VLOOKUP 三种使用场景
  12. 值得看三次的高干文_6本好看的高干文推荐,每本都值得看三次!
  13. 手把手教你如何在Innovus中解决local congestion问题
  14. 建立KMS服务器,激活WIN、office
  15. matlab 非线性拟合残差,求大神帮助一下关于matlab非线性拟合的问题
  16. 在macOS系统电脑上怎么听不到任何耳机声音怎么办?
  17. android 画布叠加,Android实现图片叠加效果的两种方法
  18. form表单提交编码介绍
  19. 网易权力与纷争手游今日上线,权力与纷争安卓模拟器电脑版攻略
  20. 操作系统中断/异常-测试题

热门文章

  1. 四川大学金融转计算机,[请教]川大和西财哪个金融系好?!
  2. linux类似360软件,linux下有什么类似鲁大师查看电脑配置的软
  3. 【H.264/AVC视频编解码技术】第二章【H264码流分析】
  4. python 港股交易数据_GitHub - 116pythonZS/futuquant: 富途量化平台 API
  5. postman 怎么调试pos_SpringBoot|第十五章:基于Postman的RESTful接口测试
  6. 26条C++的经典语录,哪几句戳中你的心!
  7. 微型计算机使用的普通编码是,2017计算机一级考试选择题练习及答案(2)
  8. vue 如何获取图片的原图尺寸_阳台洗衣机组合柜如何设计|尺寸规范|案例图片...
  9. zigbee物联网模块标准:LTE标准Cat.1和nbiot无线通信模块差异
  10. 盘点物联网的4个认知误区