NSoperation用法详解及与GCD的比较
NSInvocationOperation
// 基于一个对象和selector来创建操作。如果你已经有现有的方法来执行需要的任务,就可以使用这个类
NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
// 如果我们想在一个NSOperation执行完毕后做一些事情,就调用NSOperation的setCompletionBlock方法来设置想做的事情
[op setCompletionBlock:^{
NSLog(@"完成");
}];
// 2.开始执行任务(同步执行)
// 一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的。
[op start];
NSBlockOperation
// 能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成
NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
NSLog(@"第一个操作");
}];
// 通过addExecutionBlock方法添加block操作,开启多个线程,三个线程
[op addExecutionBlock:^{
NSLog(@"%@",[NSThread currentThread]);
NSLog(@"第二个操作");
}];
[op addExecutionBlock:^{
NSLog(@"%@",[NSThread currentThread]);
NSLog(@"第三个操作");
}];
[op start];
NSOperationQueue- 一个操作序列
//NSOperation是基于GCD的,把GCD的block封装成opertion,NSOperationQueue是全局队列封装
//将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的。
//创建一个操作队列
NSOperationQueue * queue = [[NSOperationQueue alloc] init];
NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"op2 - %@",[NSThread currentThread]);
}];
//添加NSOperation到NSOperationQueue中
//NSOperation添加到queue之后,通常短时间内就会得到运行。
// [queue addOperation:op];
// [queue addOperation:op2];
// waitUntilFinished yes 操作完成后执行下面的代码 no 先执行下面的代码
//添加一个block形式的operation
[queue addOperationWithBlock:^{
NSLog(@"op3 - %@",[NSThread currentThread]);
}];
[queue addOperations:@[op,op2] waitUntilFinished:NO];
//最大并发数,这个功能NSOperation比较常用
queue.maxConcurrentOperationCount = 2;
for (NSInteger i = 0; i < 10; i++) {
NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
[queue addOperation:op];
}
NSOperationQueue的依赖关系
self.queue = [[NSOperationQueue alloc] init];
NSInvocationOperation * op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
//设置优先级,数据量少看不出
op1.queuePriority = -4;
NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"解压图片包");
}];
op2.queuePriority = 0;
NSBlockOperation * op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"观看漫画");
}];
op3.queuePriority = 4;
//添加NSOperation的依赖对象
// [op2 addDependency:op1];
// [op3 addDependency:op2];
//注意:不能创建环形依赖,如A依赖B,B依赖A,这是错误的
// [op1 addDependency:op3];
[self.queue addOperations:@[op1,op2,op3] waitUntilFinished:YES];
//挂起状态
self.queue.suspended = !self.queue.suspended;
// 不过暂停一个queue不会导致正在执行的operation在任务中途暂停,只是简单地阻止调度新Operation执行。
// 取消queue中所有的操作
[self.queue cancelAllOperations];
//NSOperation 线程之间的通信
[self.queue addOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
NSLog(@"下载图片");
//获取主队列
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
NSLog(@"更新UI");
}];
}];
NSOperation与GCD的区别
/**
* GCD -- (iOS4.0)多线程解决方案
将任务(block)添加到队列(串行,并行(全局队列)),指定执行任务的方法。(同步,异步)
拿到dispatch_get_main_queue,线程之间的通信
NSOperation -- (iOS2.0) (后经苹果改造)
将操作添加到队列里
[NSOperationQueue mainQueue] 获取主队列,将任务添加到主队列,就会在主线程中执行
NSOperation可以设置最大并发数(用GCD处理,比较麻烦)
可以暂停可以继续,也就是挂起操作
取消所有的任务
设置依赖关系
*/
NSoperation用法详解及与GCD的比较的更多相关文章
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- @RequestMapping 用法详解之地址映射
@RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...
- linux管道命令grep命令参数及用法详解---附使用案例|grep
功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- CSS中伪类及伪元素用法详解
CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...
- c++中vector的用法详解
c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
- AngularJS select中ngOptions用法详解
AngularJS select中ngOptions用法详解 一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...
- systemctl命令用法详解
systemctl命令用法详解系统环境:Fedora 16binpath:/bin/systemctlpackage:systemd-units systemctl enable httpd.serv ...
- CSS3的@keyframes用法详解:
CSS3的@keyframes用法详解:此属性与animation属性是密切相关的,关于animation属性可以参阅CSS3的animation属性用法详解一章节. 一.基本知识:keyframes ...
随机推荐
- 二维码详解(QR Code)
作者:王子旭链接:https://zhuanlan.zhihu.com/p/21463650来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 2016.7.5 更新:长文 ...
- 修复 XE8 for Android 分享图片到 Gmail 权限不足的问题
问题:打开 XE8 的 ShareSheet 示例,发布到 Android 实机,按 Share 选 Gmail 结果显示:没有权限添加附件. 适用:XE8 for Android 修复方法: 请将源 ...
- XE7 提交 App(iOS 8)提示「does not contain the correct beta entitlement」问题修复
XE7 提交 App 后,在「Prerelease」里被提示了: Build 1.0.0 does not contain the correct beta entitlement. For more ...
- phpcms v9 数据源
先到phpcms后台的模块下找到数据源 数据源有两种方式 1,内部数据源 2,外部数据源 这里只做外部数据源.添加一个外部数据源 1)必须填写数据库链接信息,指定一个数据名(在站内调用是使用) 2)进 ...
- 编译安装php-amq扩展
用途:这个扩展是用来操作rabbitmq服务端的 一.安装总括 1.编译安装librabbitmq库 这是一个开源c语言的库.用来与rabbitmq进行通信 而php的php-amqp扩展就是使用这个 ...
- SQL不同服务器数据库之间的数据操作整理(完整版)
---------------------------------------------------------------------------------- -- Author : htl25 ...
- SQL Server 事务
from :http://www.cnblogs.com/kissdodog/p/3169788.html 事务全部是关于原子性的.原子性的概念是指可以把一些事情当做一个单元来看待.从数据库的角度看, ...
- 图标集锦:10套免费的社交媒体 & 社交网站图标
社交网络是最近几年互联网领域最热门的关键词之一,如今社会网络化媒体也成为我们信息获取和传播的重要途径,很多网站都有把内容分享到社交媒体的功能. 社交媒体图标作为向用户传递信息的重要媒介,不管是在网页还 ...
- JS高程2.在HTML中使用Javascript(2)
1.延迟脚本defer 在<script>元素中设置defer属性,相当于告诉浏览器立即下载,但是延迟执行.<script>中的脚本会延迟到浏览器遇到</html> ...
- Javascript Object、Function对象
1.Object对象 原型对象 原型是对象的一个属性,也就是prototype属性,每个对象都有这个内部属性,而且他本身也是一个对象. <script type="text/javas ...