2016 - 1- 19 NSOperationQueue的简单使用
一: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的简单使用的更多相关文章
- 学习图像算法阶段性总结 (附一键修图Demo) 2016.04.19更新demo
		今天特别感慨,自己从决定研究图像处理,势必要做出一键修图算法. 经历了,三个多月的书籍积累,三个多月的算法调整以及优化. 人是一种奇怪的动物,当你做不到的时候,你以为做到了,自己会感觉很爽,很有成就感 ... 
- 【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)
		写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shad ... 
- 【读书笔记】2016.11.19 北航 《GDG 谷歌开发者大会》整理
		2016.11.19 周六,我们在 北航参加了<GDG 谷歌开发者大会>,在web专场,聆听了谷歌公司的与会专家的技术分享. 中午免费的午餐,下午精美的下午茶,还有精湛的技术,都是我们队谷 ... 
- 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 ... 
- 2016.1.19 DEV Express控件GirdControl使用
		103.GridControl中添加Button RunDesigner,添加一列,设置对应字段FiledName,ColumnEdit选择ButtonEdit,此时默认风格像下拉框,需调整属性: 在 ... 
- Murano Weekly Meeting 2016.07.19
		Meeting time: 2016.July.19 1:00~2:00 Chairperson: Kirill Zaitsev, from Mirantis Meeting summary: 1. ... 
- 2016.8.19上午初中部NOIP普及组比赛总结
		2016.8.19上午初中部NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1338 这次总结发得有点晚啊!我在这里解释一下, 因为浏览器的问 ... 
- Directx11教程(19) 画一个简单的地形
		原文:Directx11教程(19) 画一个简单的地形 通常我们在xz平面定义一个二维的网格,然后y的值根据一定的函数计算得到,比如正弦.余弦函数的组合等等,可以得到一个看似不错的地形或者 ... 
- 2016 - 1 -19  初探NSOperation
		一:简介 1.NSOperation的作用: 配合NSOperation与NSOperationQueue也可以实现多线程. 2.NSOperation与NSOperationQueue实现多线程的步 ... 
随机推荐
- DispatcherServlet
			<servlet> <servlet-name>chapter2</servlet-name> <servlet-class>org.springfra ... 
- 1.1 ASP.NET MVC简介
			1.什么是ASP.NET MVC? (1)它是个怎么样的产品? ASP.NET MVC是微软公司.NET平台上的一个Web开发框架,它为开发者提供了一种构建结构良好的Web应用程序的方式.自2007年 ... 
- grouping sets,cube,rollup,grouping__id,group by
			例1: hive -e" select type ,status ,count(1) from usr_info where pt='2015-09-14' group by type,st ... 
- 《基于MVC的Javascript》
			var Class = function(){ var klass = function(){ this.init.apply(this,arguments); } klass.prototype.i ... 
- Linux中Matlab保存多个数据到同一个文件当中
			% load pyrim % NumTrain = 50; % load machine %NumTrain = 150; % load housing % NumTrain = 300; % loa ... 
- WCF学习笔记
			1,关于WCF/web service/WSE Web Service:是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架,也不是技术.它有一套完成的规范体系标准,而且在持 ... 
- HDU 4122
			Alice's mooncake shop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ... 
- c#获取系统时间的方法(转)
			1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ... 
- Windows server2003 + sql server2005 集群配置安装
			http://blog.itpub.net/29500582/viewspace-1249319/ 
- iOS应用程序间共享数据
			我们知道iOS由于沙盒的存在,应用程序不能越过自己的区域去访问别的存储空间的内容,不过可能有许多场景我们需要在应用程序之间共享数据,比如多个应用共用用户名密码进行登录等.虽然我们不能直接通过文件系统来 ... 
