一:NSOperationQueue的作用:

1.NSOperation可以调用start方法来执行任务,但默认是同步执行。

2.如果将NSOperation加入到NSOperationQueue中,就会自动异步执行NSOperation中的操作。

3.NSOperationQueue有两种类型,分别为

3.1主队列,通过[NSOperation  mainQueue]来获得。

3.2自建队列,通过[[NSOperation alloc] init] 来获得。自建队列既有串行,也有并发的功能。需要注意的是,凡是添加到这个队列的操作(NSOperation),都会放到子线程里去执行。

二:NSOperationQueue的使用方法:

1.直接将创建的NSOperation放到队列中。

[NSOperation addOperation:op1](会开辟新的线程去执行!)

2.通过addOperationWithBlock:直接将操作卸载block内:(也会开辟新的线程!)

  [opQ1 addOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];

三:NSOperationQueue的属性:

1.maxConcurrentOperationCount :设置队列的最大并发数。当设置为1时,即为串行队列!这个值默认是-1,当为0时怎不执行任何操作。

     NSOperationQueue *opQ1 =  [[NSOperationQueue alloc ] init];
opQ1.maxConcurrentOperationCount = ;
[opQ1 addOperationWithBlock:^{
NSLog(@"任务1 -------在当前线程%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:0.1];
}];
[opQ1 addOperationWithBlock:^{
NSLog(@"任务2 -------在当前线程%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:0.1];
}];
[opQ1 addOperationWithBlock:^{
NSLog(@"任务3 -------在当前线程%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:0.1];
}];
[opQ1 addOperationWithBlock:^{
NSLog(@"任务4 -------在当前线程%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:0.1];
}];
[opQ1 addOperationWithBlock:^{
NSLog(@"任务5 -------在当前线程%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:0.1];
}];
[opQ1 addOperationWithBlock:^{
NSLog(@"任务6 -------在当前线程%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:0.1];
}];

打印结果:

2016-01-19 18:14:48.498 NSPerationQueue[16518:1492227] 任务1 -------在当前线程<NSThread: 0x7fcc80f06410>{number = 2, name = (null)}

2016-01-19 18:14:48.498 NSPerationQueue[16518:1492228] 任务2 -------在当前线程<NSThread: 0x7fcc80e15c00>{number = 3, name = (null)}

2016-01-19 18:14:48.601 NSPerationQueue[16518:1492227] 任务4 -------在当前线程<NSThread: 0x7fcc80f06410>{number = 2, name = (null)}

2016-01-19 18:14:48.601 NSPerationQueue[16518:1492233] 任务3 -------在当前线程<NSThread: 0x7fcc80e7d2d0>{number = 4, name = (null)}

2016-01-19 18:14:48.704 NSPerationQueue[16518:1492227] 任务6 -------在当前线程<NSThread: 0x7fcc80f06410>{number = 2, name = (null)}

2016-01-19 18:14:48.704 NSPerationQueue[16518:1492228] 任务5 -------在当前线程<NSThread: 0x7fcc80e15c00>{number = 3, name = (null)}

可以发现,任务1与2同时执行,然后是3与4.....依次类推,因为此时只会同时在两个子线程中执行任务。

2.suspended属性:也译为挂起,暂停。当设置队列的这个属性时,他会暂停继续下一个操作(需要注意不是暂停当前操作)

例如:在viewDidLoad方法中代码入下:

- (void)viewDidLoad {
[super viewDidLoad];
NSOperationQueue *opQ1 = [[NSOperationQueue alloc ] init];
opQ1.maxConcurrentOperationCount = ;
[opQ1 addOperationWithBlock:^{
for (int i = ; i < ; i ++) {
NSLog(@" 任务1------%d",i);
}
}];
[opQ1 addOperationWithBlock:^{
for (int i = ; i < ; i ++) {
NSLog(@"任务2---------%d",i);
}
}];
self.queue = opQ1; // Do any additional setup after loading the view, typically from a nib.
}

在touchesBegin中代码如下:

 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
if (self.queue.isSuspended) {
self.queue.suspended = NO;
}else{
self.queue.suspended = YES;
}
}

可以发现在点击屏幕后,任务一任然会执行完毕,但任务二不会执行,因为设置了maxCurrentOperationCount =1 即队列变成了串行队列。如果设置为2,则点击后任务一与任务二都会执行完毕。

3.[self.queue cancelAllOperations];这个方法会调用队列中所有操作的cancel方法,从操作们从队列中直接移除,需要注意这个方法和上面suspended的区别。一个是暂停,还可以继续。一个是直接从队列中移除,无法继续了。

2016 - 1- 19 NSOperationQueue的简单使用的更多相关文章

  1. 学习图像算法阶段性总结 (附一键修图Demo) 2016.04.19更新demo

    今天特别感慨,自己从决定研究图像处理,势必要做出一键修图算法. 经历了,三个多月的书籍积累,三个多月的算法调整以及优化. 人是一种奇怪的动物,当你做不到的时候,你以为做到了,自己会感觉很爽,很有成就感 ...

  2. 【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)

    写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shad ...

  3. 【读书笔记】2016.11.19 北航 《GDG 谷歌开发者大会》整理

    2016.11.19 周六,我们在 北航参加了<GDG 谷歌开发者大会>,在web专场,聆听了谷歌公司的与会专家的技术分享. 中午免费的午餐,下午精美的下午茶,还有精湛的技术,都是我们队谷 ...

  4. U3D笔记11:47 2016/11/30-15:15 2016/12/19

    11:47 2016/11/30Before you can load a level you have to add it to the list of levels used in the gam ...

  5. 2016.1.19 DEV Express控件GirdControl使用

    103.GridControl中添加Button RunDesigner,添加一列,设置对应字段FiledName,ColumnEdit选择ButtonEdit,此时默认风格像下拉框,需调整属性: 在 ...

  6. Murano Weekly Meeting 2016.07.19

    Meeting time: 2016.July.19 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: 1. ...

  7. 2016.8.19上午初中部NOIP普及组比赛总结

    2016.8.19上午初中部NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1338 这次总结发得有点晚啊!我在这里解释一下, 因为浏览器的问 ...

  8. Directx11教程(19) 画一个简单的地形

    原文:Directx11教程(19) 画一个简单的地形       通常我们在xz平面定义一个二维的网格,然后y的值根据一定的函数计算得到,比如正弦.余弦函数的组合等等,可以得到一个看似不错的地形或者 ...

  9. 2016 - 1 -19 初探NSOperation

    一:简介 1.NSOperation的作用: 配合NSOperation与NSOperationQueue也可以实现多线程. 2.NSOperation与NSOperationQueue实现多线程的步 ...

随机推荐

  1. robotframework笔记21

    创建输出 当执行测试,创建多个输出文件和所有的 都以某种方式相关测试结果. 本节讨论什么 输出创建.如何配置创建,以及如何 调整他们的内容. 不同的输出文件 本节解释了不同可以创建和输出文件 如何配置 ...

  2. HTML5自学笔记[ 14 ]canvas绘图基础2

    canvas绘制路径不仅可以绘制直线和多边形,还提供了绘制曲线的方法,利用这些方法可以画出多种曲线效果. 方法1:arc(x,y,r,起始弧度,结束弧度,绘制方向);其中(x,y)为圆心坐标,r为半径 ...

  3. Log 日志级别

        一直对于程序中的日志级别有点模糊,今天专门百度学习下.遂成此文:     日志记录器(Logger)是日志处理的核心组件.log4j具有5种正常级别(Level).:  1.static Le ...

  4. struts2 mybatis spring hibernate 框架 pom.xml配置 下载地址

    访问以下地址:搜索需要框架的配置  选择需要的版本 http://mvnrepository.com

  5. hdu----(5050)Divided Land(二进制求最大公约数)

    Divided Land Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  6. 张艾迪(创始人):发明整个世界+224C个国家

    Eidyzhang:发明整个世界+224C个国家 Eidyzhang: Genius.Founder.CEO.23 I 世界级最高级创始人.世界最高级FounderCEO 出生在亚洲中国.Eidyzh ...

  7. SDWebImage源码刨根问底

    前言: SDWebImage是iOS中一款处理图片的框架, 使用它提供的方法, 一句话就能让UIImageView,自动去加载并显示网络图片,将图片缓存到内存或磁盘缓存,正好有阅读开源项目的计划,于是 ...

  8. 328. Odd Even Linked List——多利用fake_head

    Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...

  9. 转:Nginx 配置 location 总结及 rewrite 规则写法

    转: http://www.linuxidc.com/Linux/2015-06/119398.htm 1. location正则写法 一个示例: location =/{ # 精确匹配 / ,主机名 ...

  10. MongoDB相关资料

    MongoDB的介绍及安装参考http://www.cnblogs.com/lipan/archive/2011/03/08/1966463.html 安装过程: 第一步:下载安装包:官方下载地址←单 ...