多线程——NSOperationQueue
2016-03-25 18:37
411 查看
一、简介
NSOperationQueue是用来管理NSOperation对象执行的一个集合类。一个应用中可以创建多个queue,而每个queue中可以有多个operation并行执行。**注意:**queue中的operation的执行顺序和依赖关系以及operation的优先级有关。
二、创建queue
//创建一个操作队列NSOperationQueue *queue = [[NSOperationQueue alloc] init];
三、往queue中添加operation对象
// 添加operation到队列中 [queue addOperation:operation]; // 添加一组操作到队列中 [queue addOperations:operations waitUntilFinished:NO]; // 添加一个block形式的operation到队列中 [queue addOperationWithBlock:^{ NSLog(@"执行一个新的操作,线程:%@", [NSThread currentThread]); }];
**注意:**operation对象最多只能添加到一个queue中,而且当operation处于正在执行或执行完成的状态时不能添加到queue。
四、queue的属相
1、queue的operations属性和operationCount属性
可以通过queue的operations属性和operationCount属性查看queue中的operation和queue中的operation数。// 正在执行或等待执行的operation NSLog(@"%@", queue.operations); // 正在执行或等待执行的operation数 NSLog(@"%lu", queue.operationCount);
注意: operationCount返回的是queue中的瞬时情况,所以当你使用这个值的时候,实际的operation数可能是不同的。所以不要将这个值用于对象的枚举或其他的精确计算中。
2、设置queue的并行执行operation数
默认情况下queue中多个operation并行执行,我们可以通过maxConcurrentOperationCount方法修改queue中并行执行的operation数。// 设置队列最大并发操作数量 queue.maxConcurrentOperationCount = 1; [queue setMaxConcurrentOperationCount:1];
当然你也可以设置
NSOperationQueueDefaultMaxConcurrentOperationCount常量让并行执行的operation数由queue动态确定。
3、暂停queue
使用suspended属性或者setSuspended方法可以暂时停止一个queue中等待的任务,但是不会暂停正在执行的operation的任务。这个属性是一个bool值,当设置为NO的时候queue是活跃的,而设置为YES的时候queue将暂停。
// 暂停queue [queue setSuspended:YES]; queue.suspended = YES; // 恢复queue [queue setSuspended:NO]; queue.suspended = NO;
五、queue的一些常用方法
1、取消queue中的operation
添加到queue中的operation是不能删除的,但是可以使用NSOperation的cancel方法取消这个operation,或者使用NSOperationQueue的cancelAllOperations方法取消全部operation // 取消单个操作 [operation cancel]; // 取消全部操作 [queue cancelAllOperations];
2、等待operation完成
如果需要在当前线程中处理operation完成后的结果,可以使用NSOperation的waitUntilFinished方法阻塞当前线程,等待operation完成。也可以同时等待一个queue中的所有操作完成,使用NSOperationQueue的waitUntilAllOperationsAreFinished方法。注意:这样做的话会引入了更多的串行代码,限制了整个应用的并发性,同时也降低了用户体验。
// 阻塞当前线程,等待某个operation完成 [operation waitUntilFinished]; // 阻塞当前线程,等待某个queue的所有操作完成 [queue waitUntilAllOperationsAreFinished];
注意:在等待一个queue的期间,当前线程不能添加operation到queue中,但其他线程可以,因此可能会加长线程的等待时间。
相关文章推荐
- mui关于页面间传值的方法
- 关于如何修改UISearchBa灰色背景
- Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之Fragment创建
- Requirements 101: User Stories vs. Use Cases
- Handler原理笔记
- ggplot2快速教程Quick Introduction to ggplot2
- poj 2081 Recaman's Sequence
- Web 快速开发框架 WebBuilder 7 发布
- multidex导入至build失败问题
- lintcode: Implement Queue by Two Stacks
- uint8、double、mat2uint、imhist绘直方图w恩替藐视
- JAVA顺序表(Sequential List)操作
- Android4.42-Setting源码分析之蓝牙模块Bluetooth(下)
- 使用SOAPUI测试WEBAPI接口
- web UI技术方案备忘
- 能否在非UI线程更新界面呢?
- Hootsuite(互随社交)
- PreferenceActivity 中的 onBuildHeaders() 调用时机
- Hootsuite(互随社交)
- Hootsuite(互随社交)