一: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. 反编译工具reflector破解方法

    文件下载:http://files.cnblogs.com/lori/Red.Gate.Reflector7.6.rar 破解方法: 1. 断网2. 运行.NET Reflector,点击Help - ...

  2. oAuth协议学习

    我们的项目需要为一个认证网站开发一套API,这些API可以提供给很多公司来调用,但是公司在调用之前,必须先做授权认证,由此接触到了oAuth协议. 以下内容来自网络整理 定义 OAUTH协议为用户资源 ...

  3. java作业——整数相加

    设计思路:由于命令行参数都是字符串,所以解决问题的关键在于字符串和整数之间的转化.首先定义数组,让所要相加的数组成一个数组,然后实现数组的字符串转化为整数,最后相加输出就行了. 程序流程图: 源代码: ...

  4. 使用window.navigator.userAgent属性判断浏览器类型及版本

    使用window.navigator.userAgent属性判断浏览器类型及版本 2011-12-11 22:03:11 window.navigator.userAgent属性包含了浏览器类型.版本 ...

  5. JDE开发端安装笔记

    JDE版本:JD Edwards EnterpriseOne 9.1.4 for Microsoft 64bit Oracle客户端:Oracle Database 11g Release 2 Cli ...

  6. async 和await

    这个是.NET 4.5的特性,所以要求最低.NET版本为4.5. 看很多朋友还是使用的Thread来使用异步多线程操作,基本上看不见有使用Async.Await进行异步编程的.各有所爱吧,其实都可以. ...

  7. string字符串类型

    一次设置一个key-value 使用set命令可以一次设置一个key-value,使用get命令可以查询key所关联的字符串值.如下图所示. 一次设置多个key-value 使用mset命令可以设置多 ...

  8. sqlserver 2008 左补齐字符串

    SQLServer:right函数 语法 Right(string, length)   Right 函数的语法具有下面的命名参数:   部分 说明 string 必要参数.字符串表达式,从中最右边的 ...

  9. telnet与ssh有什么不同呀

    含义: 1 使用Telnet这个用来访问远程计算机的TCP/IP协议以控制你的网络设备相当于在离开某个建筑时大喊你的用户名和口令.很快会有人进行监听,并且他们会利用你安全意识的缺乏.传统的网络服务程序 ...

  10. Windows安装配置php+memcached的方法

    Windows下Memcached的安装配置方法 1.将第一个包解压放某个盘下面,比如在c:\memcached. 2.在终端(也即cmd命令界面)下输入 'c:\memcached\memcache ...