NSOperationQueue线程队列完毕finished状态检测
参考: http://stackoverflow.com/questions/1049001/get-notification-when-nsoperationqueue-finishes-all-tasks
多线程编程中,操作队列NSOperationQueue我们经常会用到的,简化了多线程的操作。至于用法就不多介绍了。这里要说的是队列执行完毕的状态检查。
我们很多时候需要在队列完成之后再进行操作,而何时队列完成,NSOperationQueue并没有内置的didFinishedSelector来供使用,因此需要自己去检查其状态。
因为NSOperationQueue兼容 key-value coding (KVC) and key-value observing (KVO)机制,因此我们可以观察NSOperationQueue的属性。NSOperationQueue可供监控观察的属性有:
operations
- read-only propertyoperationCount
- read-only propertymaxConcurrentOperationCount
- readable and writable propertysuspended
- readable and writable propertyname
- readable and writable property
实现如下:
1.初始_parseQueue
- - (NSOperationQueue *)parseQueue
- {
- if (nil == _parseQueue)
- {
- _parseQueue = [[NSOperationQueue alloc] init];
- [_parseQueue setSuspended:YES];
- //[_parseQueue setMaxConcurrentOperationCount:1];
- [_parseQueue addObserver:self
- forKeyPath:@"operations"
- options:0
- context:nil];
- }
- return _parseQueue;
- }
2.加入operation
- NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
- selector:@selector(myTask)
- object:nil];
- [self.parseQueue addOperation:operation];
- [operation release];<strong>
- rong>
3.观察值的改变:
- //KVO,观察parseQueue是否执行完
- - (void)observeValueForKeyPath:(NSString *)keyPath
- ofObject:(id)object
- change:(NSDictionary *)change
- context:(void *)context
- {
- if (object == self.parseQueue && [keyPath isEqualToString:@"operations"])
- {
- if (0 == self.parseQueue.operations.count)
- {
- DLog(@"parse finished");
- //other operation
- [_parseQueue setSuspended:YES];
- }
- }
- else
- {
- [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
- }
- }
选择对NSOperationQueue的operations进行观察,而不选operationCount是因为operationCount需要iOS 4.0以上
NSOperationQueue线程队列完毕finished状态检测相关推荐
- Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet
主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...
- 同步异步 阻塞 非阻塞 异步调用 线程队列 协程
阻塞 非阻塞 阻塞:程序遇到了IO操作 导致代码无法继续执行 交出了COU执行权 非阻塞:没有IO操作 或者即使遇到IO操作 也不阻塞代码执行 阻塞 就绪 运行指的是应用程序所处的状态写程序时 尽量减 ...
- 异步同步、阻塞非阻塞、异步回调、线程队列和协程
今天学习了异步同步.阻塞非阻塞.异步回调.线程队列和协程 一.异步同步和阻塞非阻塞 线程的三种状态: 1.就绪 2.运行 3.阻塞 阻塞:遇到了IO操作 代码卡住 无法执行下一行 CPU会切换到 ...
- python多线程队列和池_Python3 从零单排28_线程队列进程池线程池
1.线程队列 线程队列有三种:先进先出,后进先出,按优先级进出,具体如下: 1 importqueue2 3 #先进先出 4 q = queue.Queue(3)5 6 q.put(1)7 q.put ...
- java 线程的几种状态(转载)
java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...
- 线程队列,线程池和协程
线程的其他方法: threading.current_thread() #当前线程对象 getName() # 获取线程名 ident # 获取线程id threading.enumerate ...
- java不同进程的相互唤醒_Java线程生命周期与状态切换
前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...
- python锁机制_python基础(锁机制,守护线程,线程队列,线程池)
一. 互斥锁(Lock)与递归锁(RLock)机制 1.1 由互斥锁(Lock)产生的死锁现象: #互斥锁(死锁现象): #死锁现象: from threading importLock lock=L ...
- 详解Java线程生命周期与状态切换
前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...
最新文章
- Sql 删除不保留日志
- lolfps高但画面不流畅_你吃鸡卡吗,超详细和平精英画面设置教程,解决卡顿,主播都在用...
- 自动去除所有目录的隐藏属性的DOS命令
- 分布式基础篇总结(谷粒商城)
- java编程访问hdfs_以编程方式访问Java基本类型的大小
- Android 13 第一个开发者版本来了,网友直呼:Android 12 还没玩透!
- 面试题:InnoDB 中一棵 B+ 树能存多少行数据?【面试不翻车,翻车就跑路】
- Java经典设计模式-创建型模式-单例模式(Singleton)
- java 服务端解决ajax跨域问题
- 黑马程序员传智播客 正则表达式学习笔记 匹配单个字符多个字符
- mysql存储过程返回结果集_原来MySQL的存储过程也可以这么玩?
- java文件复制中文_java中如何复制文件,文件里面包含中文?java中如何把文件在控制台上显示,文件中包含中文。...
- ubuntu16.04多GPU风扇转速调整
- 三菱plc控制步进电机实例_电工进阶PLC工程师!必学步进电机的编程控制指令,你掌握了吗...
- ssci源刊里有开源期刊吗_ssci源刊里有开源期刊吗_啥是核心期刊?啥是北核啥是南核?啥是国家级?啥又是省级?都给你整明白......
- Import REC修复的时候找不到被调试程序进程
- 【先锋】七牛云存储:三年磨一剑及背后核心技术解析
- python极简讲义(张玉宏著)的几处补充说明
- Unity C# 腾讯云【短信服务】验证码功能
- ajax提交到action乱码问题
热门文章
- XVIII Open Cup named after E.V. Pankratiev. GP of Urals
- “只有DBA才能导入由其他DBA导出的文件”各种解决办法
- android 通过webview调起支付宝app支付
- JAVA基础——编程练习(二)
- POJ 3252 数位DP
- 重操JS旧业第十一弹:BOM对象
- WMI使用技巧集 C#
- C# DataTable用法详解
- C/C++ http协议发送字段,文件,单个和多张图片
- MFC的来龙去脉-----消息处理,找处理函数