iOS开发多线程编程2 - NSOperation
1.简介
NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。
NSOperation本身是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有2种:
1> Foundation框架提供了两个具体子类直接供我们使用:NSInvocationOperation和NSBlockOperation
2> 自定义子类继承NSOperation,实现内部相应的方法
2.执行操作
NSOperation调用start方法即可开始执行操作,NSOperation对象默认按同步方式执行,也就是在调用start方法的那个线程中直接执行。NSOperation对象的isConcurrent方法会告诉我们这个操作相对于调用start方法的线程,是同步还是异步执行。isConcurrent方法默认返回NO,表示操作与调用线程同步执行
二、NSInvocationOperation
1.简介
基于一个对象和selector来创建操作。如果你已经有现有的方法来执行需要的任务,就可以使用这个类
- NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self
- selector:@selector(downloadImage:)
- object:kURL];
2.创建并执行操作
三、NSBlockOperation
1.简介
能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成
通过addExecutionBlock方法添加block操作,得到的是并发执行那个
即使是在operation开始执行之前。NSOperation类提供了取消operation的方法,但对于取消行为的处理需要程序自己去控制,如果operation被直接取消,那么可能就无法正确的释放之前分配的一些资源,所以通常情况下,运行中的operation在取消时,程序需要以正确的方式释放资源并退出。
只要在operation运行中定期的在合适的位置调用isCancelled方法,并在当返回值为YES时直接return即可。在程序逻辑中,常见的正确调用isCancelled的位置包括:
- 在实际执行工作之前
- 在每个循环的执行体中,如果一次执行体耗时很长可酌情添加调用次数
- 程序相对容易终止的代码处。
执行Operation
1 .将operation对象添加到操作队列
这是执行operation对象的最简单的方法,操作队列属于NSOperatinQueue类。应用程序负责创建和维护操作队列,Application可以创建任意数量的操作队列,但实际上operation的的并行执行数量是有限制的。操作队列会和系统一起来限制operation的并发执行数量,以保持合理的系统负载。所以,创建额外的操作队列不意味着你可以执行额外的操作。
NSOperationQueue设计上是用来并发执行operation,但可以通过强制措施来保证一次运行一个operation。setMaxConcurrentOperationCount:方法可以设置操作队列并行执行的最大数量。设置为1可以保证一次运行一个operation,但operation的执行顺序却仍依赖于其它因素,如operation的就绪状态,优先级设置。所以串行化操作队列与串行化的GCD转发队列不同。需要设置operation间的依赖关系来保证它们的执行顺序是你想要的。
2 .手动执行Operation
可以在没有操作队列的前提下手动执行operation,但需要一些前提条件。尤其是operation对象必须准备好运行,并保证是调用start方法来执行。
一个operation只有在其isReady方法返回YES时才被认为是可运行的。isReady方法会被整合进NSOperation的依赖管理系统来保证operation的依赖状态。只有在依赖关系清楚后,operation才开始运行。
在手动执行operation时,必须调用其start方法。start方法在正式执行你得代码之前会做几个安全性检测。默认的start方法会生成operation依赖关系所需的KVO通知。同时保证已取消的operation不会再执行,以及在operation没就绪就开始运行时抛出异常。
iOS开发多线程编程2 - NSOperation的更多相关文章
- iOS开发多线程篇—自定义NSOperation
iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...
- iOS开发多线程篇 09 —NSOperation简单介绍
iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...
- iOS开发多线程篇 10 —NSOperation基本操作
iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...
- IOS开发 多线程编程 - NSThread
每个iOS应用程序都有个专门用来更新显示UI界面.处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验.一般的解决方案就是将 ...
- IOS开发 多线程编程 - NSOperation
一.NSOperation 1.简介 NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作. NSOperation本身是抽象基类,因此必须使用 ...
- IOS开发 多线程编程 - NSOperationQueue
一.简介 一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的.也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步 ...
- ios开发多线程四:NSOperation多图下载综合案例
#import "ViewController.h" #import "XMGAPP.h" @interface ViewController () /** t ...
- iOS开发多线程篇 11 —自定义NSOperation
iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...
- iOS开发多线程篇—NSOperation简单介绍
iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...
随机推荐
- Maven安装配置环境变量及eclipse的配置
Maven安装与配置 一.需要准备的东西 1. JDK 2. Eclipse 3. Maven程序包 二.下载与安装 1. 前往https://maven.apache.org/download. ...
- 让pandas的输出结果中显示全部数据
import pandas as pd pd.set_option('display.max_columns', 1000) pd.set_option('display.width', 1000) ...
- Python语言发展的关键时间节点
1989年:Python想法的产生 1991年:发布最早的Python可用版本 2000年:发布Python2.0 2010年:发布Python2.x系列的最后一个版本,主版本号为2.7 2008年: ...
- python3.5 安装twisted
https://blog.csdn.net/caimouse/article/details/77647952 下载地址:http://www.lfd.uci.edu/~gohlke/pythonli ...
- Matlab R2018a版离线使用帮助文档方法
转载自:Matlab R2018a版离线使用帮助文档方法 问题 Matlab R2018a版本安装后,帮助文档默认为在线方式,需要使用账号登录,如果没有激活密钥或许可证编号,就无法使用帮助文档了. 方 ...
- 北京Uber优步司机奖励政策(11月16日~11月22日)
用户组:人民优步“关羽组”(适用于11月16日-11月22日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/ ...
- ORB-SLAM(五)KeyFrame类-最小生成树
KeyFrame中维护了一个map,保存了与当前帧共视的KeyFrame*与权重(共视MapPonits数量).对关键帧之间关系是用加权有向图来完成的,那么理解其spanning tree生成树的原理 ...
- 创龙DSP6748学习之RS485收发
1. 先看下原理图,第一个问题,RS485其实就是使用的串口USART1,同时485的输出脚之间接120欧姆的电阻. 遇到个问题,为什么有两个使能引脚?还有RS485_A和RS485_B为什么分别接上 ...
- C#中Mutex的用法
C#中Mutex是互斥锁,位于System.Threading 命名空间中. 顾名思义,它是一个互斥的对象,同一时间只有一个线程可以拥有它,该类还可用于进程间同步的同步基元. 如果当前有一个线程拥有它 ...
- 你需要掌握的http知识
作为一名前端er,http是我们必须要掌握的,那么我们到底需要掌握哪些东西呢 一.基础知识 这里我们介绍与http相关的TCP.IP.DNS.url.uri 1.IP IP地址是我们很熟悉的东西,最常 ...