iOS开发多线程篇—NSOperation基本操作
iOS开发多线程篇—NSOperation基本操作
一、并发数
(1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3
(2)最大并发数:同一时间最多只能执行的任务的个数。
(3)最⼤大并发数的相关⽅方法
- (NSInteger)maxConcurrentOperationCount; - (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
说明 :如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能内存多久开多一点,内存少就开少一点。
注意 :num的值并不代表线程的个数,仅仅代表线程的ID。
提示 :最大并发数不要乱写(5以内),不要开太多,一般以2~3为宜,因为虽然任务是在子线程进行处理的,但是cpu处理这些过多的子线程可能会影响UI,让UI变卡。
二、队列的取消,暂停和恢复
(1)取消队列的所有操作
- (void)cancelAllOperations;
提⽰ :也可以调用NSOperation的- (void)cancel⽅法取消单个操作
(2)暂停和恢复队列
- (void)setSuspended:(BOOL)b; // YES代表暂停队列,NO代表恢复队列
- (BOOL)isSuspended; //当前状态
(3)暂停和恢复的适用场合:在tableview界面,开线程下载远程的网络界面,对UI会有影响,使用户体验变差。那么这种情况,就可以设置在用户操作UI(如滚动屏幕)的时候,暂停队列(不是取消队列),停止滚动的时候,恢复队列。
三、操作优先级
(1)设置NSOperation在queue中的优先级,可以改变操作的执⾏优先级
- (NSOperationQueuePriority)queuePriority; - (void)setQueuePriority:(NSOperationQueuePriority)p;
(2)优先级的取值
NSOperationQueuePriorityVeryLow = -8L,
NSOperationQueuePriorityLow = -4L,
NSOperationQueuePriorityNormal = 0,
NSOperationQueuePriorityHigh = 4,
NSOperationQueuePriorityVeryHigh = 8
说明 :优先级高的任务,调用的几率会更大。
四、操作依赖
(1)NSOperation之间可以设置依赖来保证执行顺序,⽐如一定要让操作A执行完后,才能执行操作B,可以像下面这么写
[operationB addDependency:operationA]; // 操作B依赖于操作
(2)可以在不同queue的NSOperation之间创建依赖关系
注意 :不能循环依赖(不能A依赖于B,B又依赖于A)。
(3)代码示例
1 #import"YYViewController.h"2 3 @interface YYViewController () 4 5 @end 6 7 @implementation YYViewController 8 9 - (void)viewDidLoad 10 { 11 [super viewDidLoad]; 12 13 //创建NSInvocationOperation对象,封装操作 14 NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil]; 15 NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil]; 16 //创建对象,封装操作 17 NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{ 18 for (int i=0; i<5; i++) { 19 NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]); 20 } 21 }]; 22 [operation3 addExecutionBlock:^{ 23 for (int i=0; i<5; i++) { 24 NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]); 25 } 26 }]; 27 28 //设置操作依赖 29 //先执行operation2,再执行operation1,最后执行operation3 30 [operation3 addDependency:operation1]; 31 [operation1 addDependency:operation2]; 32 33 //不能是相互依赖 34 //[operation3 addDependency:operation1]; 35 //[operation1 addDependency:operation3]; 36 37 //创建NSOperationQueue 38 NSOperationQueue * queue=[[NSOperationQueue alloc]init]; 39 //把操作添加到队列中 40 [queue addOperation:operation1]; 41 [queue addOperation:operation2]; 42 [queue addOperation:operation3]; 43 } 44 45 -(void)test1 46 { 47 for (int i=0; i<5; i++) { 48 NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]); 49 } 50 } 51 52 -(void)test2 53 { 54 for (int i=0; i<5; i++) { 55 NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]); 56 } 57 } 58 59 @end
打印查看:
A做完再做B,B做完才做C。
注意 :一定要在添加之前,进行设置。
提示 :任务添加的顺序并不能够决定执行顺序,执行的顺序取决于依赖。使用Operation的目的就是为了让开发人员不再关心线程。
5.操作的监听
可以监听一个操作的执行完毕
- (void (^)(void))completionBlock; - (void)setCompletionBlock:(void (^)(void))block;
代码示例
第一种方式:可以直接跟在任务后面编写需要完成的操作,如这里在下载图片后,紧跟着下载第二张图片。但是这种写法有的时候把两个不相关的操作写到了一个代码块中,代码的可阅读性不强。
1 #import "YYViewController.h"2 3 @interface YYViewController () 4 5 @end 6 7 @implementation YYViewController 8 9 - (void)viewDidLoad 10 { 11 [super viewDidLoad]; 12 13 //创建对象,封装操作 14 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{ 15 NSLog(@"-operation-下载图片-%@",[NSThread currentThread]); 16 //.....下载图片后继续进行的操作 17 NSLog(@"--接着下载第二张图片--"); 18 }]; 19 20 //创建队列 21 NSOperationQueue *queue=[[NSOperationQueue alloc]init]; 22 //把任务添加到队列中(自动执行,自动开线程) 23 [queue addOperation:operation]; 24 } 25 26 @end
第二种方式:
1 #import "YYViewController.h"2 3 @interface YYViewController () 4 5 @end 6 7 @implementation YYViewController 8 9 - (void)viewDidLoad 10 { 11 [super viewDidLoad]; 12 13 //创建对象,封装操作 14 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{ 15 for (int i=0; i<10; i++) { 16 NSLog(@"-operation-下载图片-%@",[NSThread currentThread]); 17 } 18 }]; 19 20 //监听操作的执行完毕 21 operation.completionBlock=^{ 22 //.....下载图片后继续进行的操作 23 NSLog(@"--接着下载第二张图片--"); 24 }; 25 26 //创建队列 27 NSOperationQueue *queue=[[NSOperationQueue alloc]init]; 28 //把任务添加到队列中(自动执行,自动开线程) 29 [queue addOperation:operation]; 30 } 31 32 @end
打印查看:
说明 :在上一个任务执行完后,会执行operation.completionBlock=^{}代码段,且是在当前线程执行(2)。
» 下一篇:iOS开发多线程篇—基础知识 NSOperation
posted on 2015-05-03 19:54 iosblog's 阅读(7) 评论(0) 编辑 收藏
转载于:https://www.cnblogs.com/HypeCheng/p/4500683.html
iOS开发多线程篇—NSOperation基本操作相关推荐
- iOS开发多线程篇—自定义NSOperation
iOS开发多线程篇-自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...
- iOS开发多线程篇—多线程简介
iOS开发多线程篇-多线程简介 一.进程和线程 1.什么是进程 进程是指在系统中正在执行的一个应用程序 每一个进程之间是独立的.每一个进程均执行在其专用且受保护的内存空间内 比方同一时候打开QQ.Xc ...
- iOS开发多线程篇—线程的状态
iOS开发多线程篇-线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(te ...
- iOS开发多线程篇—线程安全
一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数 ...
- iOS开发多线程篇—多线程简单介绍
一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过& ...
- iOS开发——多线程篇——GCD
一.基本概念 1.简介 什么是GCD 全称是Grand Central Dispatch,可译为"牛逼的中枢调度器" 纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公 ...
- ios开发多线程篇--异步加载网络图片GCD
一.异步加载网络图片 1.ATS (1)简介 从iOS9.0开始,如果按照以前的方式写代码,在访问网络的时候 ,会报以下警告信息: App Transport Security has blocked ...
- iOS开发网络篇—多线程断点下载
iOS开发网络篇-多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...
- iOS开发UI篇—transframe属性(形变)
iOS开发UI篇-transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两 ...
- iOS开发UI篇—多控制器和导航控制器简单介绍
iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...
最新文章
- 正向代理和反向代理??
- Java常用的技术网站
- ANTLR和StringTemplate
- Android学习(二十)Notification通知栏
- multiset实现ALV树
- 【实用工具系列】MathCAD入门安装及快速上手使用教程
- AutoCAD2018_输出与打印
- python xlwt使用_Python使用xlwt模块 操作Excel文件
- YOLOv3源码解析1-代码整体结构
- 网路连接配置和DNS服务?解决无线网卡连接WIFI问题(硬件和驱动没问题)?
- 流程图 自定义函数_让客户信任感倍增?酷家乐推出“自定义清单”功能,为精准报价加码!...
- JAVA-stage3-day03-MybatisMybatisPlus
- BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元
- 思科关闭日志_详解Cisco(思科)路由器的故障日志
- dw自动滚动图片_Dreamweaver连续滚动图片的制作
- python 颜色与字体
- 深入理解计算机系统简述
- 修改服务器tcp会话数,windows2012服务器TCP连接数
- 判断滚动条向上还是向下
- Unity3d 坦克大战开发日志1
热门文章
- SpringBoot+JSON+AJAX+ECharts+Fiddler实现前后端分离开发可视化(进阶篇)
- jar包add to build path与放入lib下
- TCP异常终止(RESET报文)
- 每天一道剑指offer-二叉搜索数的后序遍历序列
- mysql c3p0 释放连接池_mysql – 如何阻止c3p0连接池隐藏连接异常的原因?
- python中迭代器_【Python】解析Python中的迭代器
- python numpy 数据类型为python对象-关于Numpy数据类型对象(dtype)使用详解
- 如何手绘表格_Word2010中怎样用画笔绘制表格
- mybatis oracle 多条件批量删除_面试官经常喜欢问的Mybatis经典面试题,值得好好收藏哦!...
- Java编程:分治算法
昵称:
注销 订阅评论
[使用Ctrl+Enter键快速提交]
融云,免费为你的App加入IM功能——让你的App“聊”起来!!
· 居然还有那么多人在使用腾讯QQ空间
· 更“健康”的星巴克有机会超越麦当劳?
· 聘用老程序员的4大原因
· 和阿里云成立合资企业的迪拜企业Meraas是什么来头?
· 国际空间站的迷你电脑长啥样?能运行多系统长得还挺漂亮
» 更多新闻...
· 贫血,充血模型的解释以及一些经验
· 如何避免软件工程中最昂贵错误的发生
· 面向服务体系和遗留系统
· 运维的本质——可视化
» 更多知识库文章...