一: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. ajax正确的简单封装“姿势”

    window.meng = window.meng || {}; (function ($) { function getAjaxDate(url, apikey) { var datas; $.aj ...

  2. CentOS中yum安装软件时报错:No package XXX available

    yum 安装软件时,报错:No package XXX available. [root@localhost ~]# yum -y install redis Loaded plugins: fast ...

  3. Java GC系列(1):Java垃圾回收简介

    本文由 ImportNew - 好好先生 翻译自 javapapers. Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Ja ...

  4. hdu------(4302)Holedox Eating(树状数组+二分)

    Holedox Eating Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. Mybatis 实用

    1.<delete id="removeZtreeS" parameterType="String"> DELETE FROM sys_fun WH ...

  6. 'NSUnknownKeyException' this class is not key value coding-compliant for the key XXX

    错误: Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefi ...

  7. placehold.it-在线图片生成器(转载)

    做网站的时候 如果 有的产品等客户没有上传图片,可以用这个网站生成的图片 并配以文字进行图片的占位 以免造成页面的空挡或者页面错位等 原文地址:http://www.cnblogs.com/xumen ...

  8. 在唯一密钥属性“name”设置为“ScriptHandlerFactory”时,无法添加类型为“add”的重复集合项

    出错原因:同一根目录下有两个相同的WebConfig文件 解决办法:删除子其中一个webConfig文件. 详细:

  9. 9. shell环境

    • printenv –打印部分或所有的环境变量 • set –设置 shell 选项 • export —导出环境变量,让随后执行的程序知道. • alias –创建命令别名 1.shell环境:s ...

  10. linux下git的安装和使用(转)

    转自:http://www.cnblogs.com/sunada2005/archive/2013/06/06/3121098.html 最近在使用github,感觉不错.在windows下,可使用g ...