iOS 之NSOperation(一)
一、NSOperation的介绍
1、NSOperation的作用
配合使用NSOperation和NSOperationQueue实现多线程编程
2、实现多线程的具体步骤
1)将需要执行的操作封装到一个NSOperation对象中
2)将NSOperation对象添加到NSOperationQueue中
3)系统自动将NSOperationQueue中的NSOperation取出来,并且将封装的操作放到一条新线程中执行
3、NSOperation十个抽象类,并没有封装操作的能力,必须使用它的子类
4、子类的三种形式
1)NSInvocationOperation
2)NSBlockOpera
3)自定义继承自NSOperation的子类,实现内部相应的方法
二、结合代码
1、NSInvocationOperation的使用
1)没有添加到队列
- (void)useNSInvocationOperation {//1.封装操作NSInvocationOperation * operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask) object:nil];//开始执行 [operation1 start];NSInvocationOperation * operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask2) object:nil];[operation2 start];} - (void)invocationTask {NSLog(@"invocationTask,%@",[NSThread currentThread]); } - (void)invocationTask2 {NSLog(@"invocationTask2,%@",[NSThread currentThread]); }
打印结果:
2016-03-14 17:53:59.638 NSoperation[3071:257804] invocationTask,<NSThread: 0x7f86fad06cb0>{number = 1, name = main}
2016-03-14 17:53:59.639 NSoperation[3071:257804] invocationTask2,<NSThread: 0x7f86fad06cb0>{number = 1, name = main}
注意事项:结果中可以看出如果没有放到队列中,默认同步执行,都在主线程。
2)添加到队列
1 - (void)useNSInvocationOperation 2 { 3 //1.封装操作 4 NSInvocationOperation * operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask) object:nil]; 5 6 NSInvocationOperation * operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask2) object:nil]; 7 8 //2.创建队列 9 NSOperationQueue * queue = [[NSOperationQueue alloc]init]; 10 queue.maxConcurrentOperationCount = 2;//最大线程数:2-3最好 11 12 //3.添加操作到队列 13 [queue addOperation:operation1]; 14 [queue addOperation:operation2]; 15 16 } 17 - (void)invocationTask 18 { 19 NSLog(@"invocationTask,%@",[NSThread currentThread]); 20 } 21 - (void)invocationTask2 22 { 23 NSLog(@"invocationTask2,%@",[NSThread currentThread]); 24 }
打印结果:
2016-03-14 17:57:33.192 NSoperation[3083:261277] invocationTask2,<NSThread: 0x7fd9b8f07ee0>{number = 2, name = (null)}
2016-03-14 17:57:33.192 NSoperation[3083:261278] invocationTask,<NSThread: 0x7fd9b8e13210>{number = 3, name = (null)}
根据打印结果可以看出加入队列之后,系统又开启了两条线程。
2、NSBlockOperation的使用
1 //1.封装操作 2 NSBlockOperation * operation1 = [NSBlockOperation blockOperationWithBlock:^{ 3 NSLog(@"NSBlockOperation---operation1,%@",[NSThread currentThread]); 4 }]; 5 //2.添加更多的操作 6 [operation1 addExecutionBlock:^{ 7 NSLog(@"NSBlockOperation---%@",[NSThread currentThread]); 8 }]; 9 10 [operation1 start];
输出结果:
2016-03-14 18:04:22.577 NSoperation[3105:266124] NSBlockOperation---operation1,<NSThread: 0x7f9e7850a1c0>{number = 1, name = main}
2016-03-14 18:04:22.577 NSoperation[3105:266206] NSBlockOperation---<NSThread: 0x7f9e785a4eb0>{number = 2, name = (null)}
注意事项:只要NSBlockOperation的封装操作数大于1,就会执行一部操作
3、给线程添加依赖
1 - (void)useNSInvocationOperation 2 { 3 //1.封装操作 4 NSInvocationOperation * operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask) object:nil]; 5 6 NSInvocationOperation * operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask2) object:nil]; 7 8 NSInvocationOperation * operation3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask3) object:nil]; 9 10 //2.创建队列 11 NSOperationQueue * queue = [[NSOperationQueue alloc]init]; 12 queue.maxConcurrentOperationCount = 3;//最大线程数:2-3最好 13 14 //2.1设置依赖 15 [operation1 addDependency:operation3]; 16 [operation3 addDependency:operation2]; 17 18 //3.添加操作到队列 19 [queue addOperation:operation1]; 20 [queue addOperation:operation2]; 21 [queue addOperation:operation3]; 22 23 } 24 - (void)invocationTask 25 { 26 NSLog(@"invocationTask,%@",[NSThread currentThread]); 27 } 28 - (void)invocationTask2 29 { 30 NSLog(@"invocationTask2,%@",[NSThread currentThread]); 31 } 32 - (void)invocationTask3 33 { 34 NSLog(@"invocationTask3,%@",[NSThread currentThread]); 35 }
输出结果:
2016-03-14 18:12:21.066 NSoperation[3135:272293] invocationTask2,<NSThread: 0x7f845a54e500>{number = 2, name = (null)}
2016-03-14 18:12:21.067 NSoperation[3135:272293] invocationTask3,<NSThread: 0x7f845a54e500>{number = 2, name = (null)}
2016-03-14 18:12:21.067 NSoperation[3135:272293] invocationTask,<NSThread: 0x7f845a54e500>{number = 2, name = (null)}
根据结果可以看出先执行的2又执行的3最后执行的1,并没有根据添加到队列的顺序执行。
4、设置线程的优先级
1)operation1.queuePriority = NSOperationQueuePriorityHigh;
2)优先级的取值
NSOperationQueuePriorityVeryLow = -8L,
NSOperationQueuePriorityLow = -4L,
NSOperationQueuePriorityNormal = 0,
NSOperationQueuePriorityHigh = 4,
NSOperationQueuePriorityVeryHigh = 8
转载于:https://www.cnblogs.com/fengzhihao/p/5276675.html
iOS 之NSOperation(一)相关推荐
- IOS基础NSOperation的操作优先级和操作依赖
IOS基础NSOperation的操作优先级和操作依赖 操作优先级 // ViewController.m // 34-操作优先级 // Created by 鲁军 on 2021/3/9. #imp ...
- 【iOS】NSOperation
参考博客:NSOperation简介 [iOS]NSOperation, NSOperationQueue NSOperation的简单介绍 NSOperation 是居于objective-c对GC ...
- ios 多线程 -- NSOperation 常用方法
1 最大并发数 最大并发数:同一时间最多只能执行的任务的个数. 最⼤大并发数的相关⽅方法 - (NSInteger)maxConcurrentOperationCount; - (void)setMa ...
- ios多线程 -- NSOperation 简介
NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: 1)先 ...
- iOS面试一般性问题
转载自:http://www.huangyibiao.com/archives/391 注意:以下问题的参考答案均为笔者所答,不代表正确,问题答案因人而异,请根据自己的实际情况回答,若认为不合理,请在 ...
- iOS - 学习路径图
基础 iOS - Runtime iOS - RunLoop iOS - Block iOS - 性能优化 iOS - 内存管理 UI设计 iOS UI设计 - 设计步骤 UIKIt iOS UIKi ...
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)
2017-07-08 remember17 Cocoa开发者社区 目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 ...
- iOS多线程:『NSOperation、NSOperationQueue』详尽总结
2019独角兽企业重金招聘Python工程师标准>>> iOS多线程:『NSOperation.NSOperationQueue』详尽总结 转载: 原地址https://www.ji ...
- iOS开发多线程篇—自定义NSOperation
iOS开发多线程篇-自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...
- iOS中的多线程 NSOperation
在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下NSOperation的使用. NSOperation ...
最新文章
- JVM最多支持多少个线程?
- oracle导出超过100m的数据库,Oracle数据库的导出和导入
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
- 如何在bash脚本中提示用户进行确认? [重复]
- mysql 远程连接
- 网络IPC:套接字之建立连接
- linux dd iflag oflag,centos – dd oflag =直接5倍速
- Linux系统服务之dhcp
- KG—ARM-Thumb子程序调用规则—ATPCS
- [leetcode]1.Two Sum
- Y400中通过easybcd在win7下面的安装Ubuntu14
- 项目启动报 myql字符集报错的问题
- 腾讯地图和百度地图经纬度的相互转换
- 玩转SpringCloud(F版本) 四.路由网关(zuul)
- 彻底解决Ubuntu18.04搜狗拼音输入法问题---支持Pycharm、WPS
- Deep Learning中的层结构
- 【前端学习-函数】js基础学习笔记
- Ubuntu深度学习环境部署——显卡驱动、CUDA、cuDNN、pytorch
- 公司常用的Project管理工具
- 工具综合症?资料收集狂?
热门文章
- NPAPI:WINDOWS中,调用函数不能阻塞
- 银河麒麟双击deb包无法安装
- 百度人脸识别文档冲突,facetype应是face_type
- 从山顶透过云层看城市
- 一个简单进程池的实现
- 指向Member Function的指针
- 学习c++ 必知三大特性
- c++读取文本文件里的指定位置的字符_(12)文本文件操作参考
- mysql指定库执行sql语句_对多个mysql的一部分库进行执行sql语句
- 天线远场定义_高频电磁仿真软件的选型和评估(天线、雷达、电路与器件、无线电总体等)——探讨分享,思路梳理...