参考: 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 property

  • operationCount - read-only property

  • maxConcurrentOperationCount - readable and writable property

  • suspended - readable and writable property

  • name - readable and writable property

实现如下:

1.初始_parseQueue

[cpp] view plaincopy
  1. - (NSOperationQueue *)parseQueue
  2. {
  3. if (nil == _parseQueue)
  4. {
  5. _parseQueue = [[NSOperationQueue alloc] init];
  6. [_parseQueue setSuspended:YES];
  7. //[_parseQueue setMaxConcurrentOperationCount:1];
  8. [_parseQueue addObserver:self
  9. forKeyPath:@"operations"
  10. options:0
  11. context:nil];
  12. }
  13. return _parseQueue;
  14. }

2.加入operation

[cpp] view plaincopy
  1. NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
  2. selector:@selector(myTask)
  3. object:nil];
  4. [self.parseQueue addOperation:operation];
  5. [operation release];<strong>
  6. rong>

3.观察值的改变

[html] view plaincopy
  1. //KVO,观察parseQueue是否执行完
  2. - (void)observeValueForKeyPath:(NSString *)keyPath
  3. ofObject:(id)object
  4. change:(NSDictionary *)change
  5. context:(void *)context
  6. {
  7. if (object == self.parseQueue && [keyPath isEqualToString:@"operations"])
  8. {
  9. if (0 == self.parseQueue.operations.count)
  10. {
  11. DLog(@"parse finished");
  12. //other operation
  13. [_parseQueue setSuspended:YES];
  14. }
  15. }
  16. else
  17. {
  18. [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  19. }
  20. }

选择对NSOperationQueue的operations进行观察,而不选operationCount是因为operationCount需要iOS 4.0以上

NSOperationQueue线程队列完毕finished状态检测相关推荐

  1. Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet

    主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...

  2. 同步异步 阻塞 非阻塞 异步调用 线程队列 协程

    阻塞 非阻塞 阻塞:程序遇到了IO操作 导致代码无法继续执行 交出了COU执行权 非阻塞:没有IO操作 或者即使遇到IO操作 也不阻塞代码执行 阻塞 就绪 运行指的是应用程序所处的状态写程序时 尽量减 ...

  3. 异步同步、阻塞非阻塞、异步回调、线程队列和协程

    今天学习了异步同步.阻塞非阻塞.异步回调.线程队列和协程 一.异步同步和阻塞非阻塞 线程的三种状态: 1.就绪 2.运行 3.阻塞 阻塞:遇到了IO操作  代码卡住  无法执行下一行  CPU会切换到 ...

  4. python多线程队列和池_Python3 从零单排28_线程队列进程池线程池

    1.线程队列 线程队列有三种:先进先出,后进先出,按优先级进出,具体如下: 1 importqueue2 3 #先进先出 4 q = queue.Queue(3)5 6 q.put(1)7 q.put ...

  5. java 线程的几种状态(转载)

    java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...

  6. 线程队列,线程池和协程

    线程的其他方法: threading.current_thread() #当前线程对象 getName() # 获取线程名 ident  # 获取线程id    threading.enumerate ...

  7. java不同进程的相互唤醒_Java线程生命周期与状态切换

    前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...

  8. python锁机制_python基础(锁机制,守护线程,线程队列,线程池)

    一. 互斥锁(Lock)与递归锁(RLock)机制 1.1 由互斥锁(Lock)产生的死锁现象: #互斥锁(死锁现象): #死锁现象: from threading importLock lock=L ...

  9. 详解Java线程生命周期与状态切换

    前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...

最新文章

  1. Sql 删除不保留日志
  2. lolfps高但画面不流畅_你吃鸡卡吗,超详细和平精英画面设置教程,解决卡顿,主播都在用...
  3. 自动去除所有目录的隐藏属性的DOS命令
  4. 分布式基础篇总结(谷粒商城)
  5. java编程访问hdfs_以编程方式访问Java基本类型的大小
  6. Android 13 第一个开发者版本来了,网友直呼:Android 12 还没玩透!
  7. 面试题:InnoDB 中一棵 B+ 树能存多少行数据?【面试不翻车,翻车就跑路】
  8. Java经典设计模式-创建型模式-单例模式(Singleton)
  9. java 服务端解决ajax跨域问题
  10. 黑马程序员传智播客 正则表达式学习笔记 匹配单个字符多个字符
  11. mysql存储过程返回结果集_原来MySQL的存储过程也可以这么玩?
  12. java文件复制中文_java中如何复制文件,文件里面包含中文?java中如何把文件在控制台上显示,文件中包含中文。...
  13. ubuntu16.04多GPU风扇转速调整
  14. 三菱plc控制步进电机实例_电工进阶PLC工程师!必学步进电机的编程控制指令,你掌握了吗...
  15. ssci源刊里有开源期刊吗_ssci源刊里有开源期刊吗_啥是核心期刊?啥是北核啥是南核?啥是国家级?啥又是省级?都给你整明白......
  16. Import REC修复的时候找不到被调试程序进程
  17. 【先锋】七牛云存储:三年磨一剑及背后核心技术解析
  18. python极简讲义(张玉宏著)的几处补充说明
  19. Unity C# 腾讯云【短信服务】验证码功能
  20. ajax提交到action乱码问题

热门文章

  1. XVIII Open Cup named after E.V. Pankratiev. GP of Urals
  2. “只有DBA才能导入由其他DBA导出的文件”各种解决办法
  3. android 通过webview调起支付宝app支付
  4. JAVA基础——编程练习(二)
  5. POJ 3252 数位DP
  6. 重操JS旧业第十一弹:BOM对象
  7. WMI使用技巧集 C#
  8. C# DataTable用法详解
  9. C/C++ http协议发送字段,文件,单个和多张图片
  10. MFC的来龙去脉-----消息处理,找处理函数