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开发多线程篇
绿色通道: 好文要顶 关注我收藏该文与我联系

iosblog's
关注 - 1
粉丝 - 0

+加关注

0
0
(请您对文章做出评价)

« 上一篇:iOS开发多线程篇—单例模式(ARC) - 文顶顶
» 下一篇:iOS开发多线程篇—基础知识 NSOperation

posted on 2015-05-03 19:54 iosblog's 阅读(7) 评论(0) 编辑 收藏

发表评论

昵称:

评论内容:
     

注销 订阅评论

[使用Ctrl+Enter键快速提交]

最新IT新闻:
· 居然还有那么多人在使用腾讯QQ空间
· 更“健康”的星巴克有机会超越麦当劳?
· 聘用老程序员的4大原因
· 和阿里云成立合资企业的迪拜企业Meraas是什么来头?
· 国际空间站的迷你电脑长啥样?能运行多系统长得还挺漂亮
» 更多新闻...
最新知识库文章:

· 说说领域驱动设计和贫血、失血、充血模型
· 贫血,充血模型的解释以及一些经验
· 如何避免软件工程中最昂贵错误的发生
· 面向服务体系和遗留系统
· 运维的本质——可视化

» 更多知识库文章...

< 2015年5月 >
26 27 28 29 30 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

导航

  • 博客园
  • 首页
  • 新随笔
  • 联系
  • 订阅
  • 管理

统计

  • 随笔 - 111
  • 文章 - 2
  • 评论 - 0
  • 引用 - 0

公告

昵称:iosblog's
园龄:14天
粉丝:0
关注:1

+加关注

posted on 2015-05-13 15:53 城之内 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/HypeCheng/p/4500683.html

iOS开发多线程篇—NSOperation基本操作相关推荐

  1. iOS开发多线程篇—自定义NSOperation

    iOS开发多线程篇-自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

  2. iOS开发多线程篇—多线程简介

    iOS开发多线程篇-多线程简介 一.进程和线程 1.什么是进程 进程是指在系统中正在执行的一个应用程序 每一个进程之间是独立的.每一个进程均执行在其专用且受保护的内存空间内 比方同一时候打开QQ.Xc ...

  3. iOS开发多线程篇—线程的状态

    iOS开发多线程篇-线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(te ...

  4. iOS开发多线程篇—线程安全

    一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数 ...

  5. iOS开发多线程篇—多线程简单介绍

    一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过& ...

  6. iOS开发——多线程篇——GCD

    一.基本概念 1.简介 什么是GCD 全称是Grand Central Dispatch,可译为"牛逼的中枢调度器" 纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公 ...

  7. ios开发多线程篇--异步加载网络图片GCD

    一.异步加载网络图片 1.ATS (1)简介 从iOS9.0开始,如果按照以前的方式写代码,在访问网络的时候 ,会报以下警告信息: App Transport Security has blocked ...

  8. iOS开发网络篇—多线程断点下载

    iOS开发网络篇-多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...

  9. iOS开发UI篇—transframe属性(形变)

    iOS开发UI篇-transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两 ...

  10. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

最新文章

  1. 正向代理和反向代理??
  2. Java常用的技术网站
  3. ANTLR和StringTemplate
  4. Android学习(二十)Notification通知栏
  5. multiset实现ALV树
  6. 【实用工具系列】MathCAD入门安装及快速上手使用教程
  7. AutoCAD2018_输出与打印
  8. python xlwt使用_Python使用xlwt模块 操作Excel文件
  9. YOLOv3源码解析1-代码整体结构
  10. 网路连接配置和DNS服务?解决无线网卡连接WIFI问题(硬件和驱动没问题)?
  11. 流程图 自定义函数_让客户信任感倍增?酷家乐推出“自定义清单”功能,为精准报价加码!...
  12. JAVA-stage3-day03-MybatisMybatisPlus
  13. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元
  14. 思科关闭日志_详解Cisco(思科)路由器的故障日志
  15. dw自动滚动图片_Dreamweaver连续滚动图片的制作
  16. python 颜色与字体
  17. 深入理解计算机系统简述
  18. 修改服务器tcp会话数,windows2012服务器TCP连接数
  19. 判断滚动条向上还是向下
  20. Unity3d 坦克大战开发日志1

热门文章

  1. SpringBoot+JSON+AJAX+ECharts+Fiddler实现前后端分离开发可视化(进阶篇)
  2. jar包add to build path与放入lib下
  3. TCP异常终止(RESET报文)
  4. 每天一道剑指offer-二叉搜索数的后序遍历序列
  5. mysql c3p0 释放连接池_mysql – 如何阻止c3p0连接池隐藏连接异常的原因?
  6. python中迭代器_【Python】解析Python中的迭代器
  7. python numpy 数据类型为python对象-关于Numpy数据类型对象(dtype)使用详解
  8. 如何手绘表格_Word2010中怎样用画笔绘制表格
  9. mybatis oracle 多条件批量删除_面试官经常喜欢问的Mybatis经典面试题,值得好好收藏哦!...
  10. Java编程:分治算法