一: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. [Hadoop 周边] Hadoop技术生态圈

    Hadoop版本演进 当前Hadoop有两大版本:Hadoop 1.0和Hadoop 2.0. Hadoop1.0被称为第一代Hadoop,由分布式文件系统HDFS和分布式计算框架MapReduce组 ...

  2. ember

    为什么要用这种单页面应用.单页面应用就可以是一个web app ,而不是一个web site了,但是百度的大王是退mvc的,考虑到gc什么的? 所以说写组件component和mvc压根是两个完全从角 ...

  3. 368. Largest Divisible Subset -- 找出一个数组使得数组内的数能够两两整除

    Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of ...

  4. android关于uses-permission权限列表

    在编写Android程序时经常会忘记添加权限,下面是网上收集的关于Androiduses-permission的资料,方便查找~ android.permission.ACCESS_CHECKIN_P ...

  5. Objective-C:Foundation框架-常用类-NSMutableDictionary

    直接上代码吧: #import <Foundation/Foundation.h> @interface Student : NSObject @property (nonatomic, ...

  6. js创建table表格

    //js创建table表格var tr;var cell;for(var i=0;i<10;i++){ //创建一个tr tr=document.createElement('tr'); doc ...

  7. 一个Java递归程序

    先来没事搜了一些面试题来做,其中一道:输入一个整数,求这个整数中每位数字相加的和? 思考:1.如何或得每一位数:假如是1234,   1234%10=4,得到个位:(1234/10)%10=3得到十位 ...

  8. loadrunner 打印变量

    打印userid变量参数的信息 web_submit_form("ValidateLoginAction.do_2",  "Snapshot=t2.inf",  ...

  9. 如何对HTML进行编码和解码?

    答案:这个比较简单//HTML进行编码和解码Console.WriteLine(System.Web.HttpUtility.HtmlEncode("<h1>我是中文字符!< ...

  10. table表格

    表格是一种组织整理的数据的手段,在div布局还未流行是,也用来布局,一个表格包含了表格整体.表格头部.每个表格均有若干行,每行被分为若干单元格. 在HTML中表格使用table标签来定义,行由< ...