使用 NSOperation 以及 NSOperationQueue
NSOperation vs. Grand Central Dispatch (GCD)
在Mac OS X v10.6和iOS4之前,NSOperation 与 NSOperationQueue 不同于GCD,他们使用了完全不同的机制。
从Mac OS X v10.6和iOS4开始,NSOperation 和 NSOperationQueue是建立在GCD上的。作为一种通例,苹果推荐使用最高级别的抽象,然而当评估显示有需要时,会突然降到更低级别。
以下是对两者的快速比较,它会帮助你决定何时何地去使用GCD或者NSOperation和NSOperationQueue;
NSOperation API
NSOperation 类有一个相当简短的声明。要定制一个操作,可以遵循以下步骤:
为了你能够测试代码,请新建一个类,继承自NSOperation,写成如下的形式:
之后再进行操作:
注意,只有将一个任务添加进了队列当中,这个任务才会被执行.
以下代码是并发执行2个任务,队列的最大并发数是4:
任务具有的优先级:
当你添加了操作到一个队列时,在对操作调用“start”方法之前,NSOperationQueue会浏览所有的操作。那些有较高优先级的操作会被先执行。有同等优先级的操作会按照添加到队列中的顺序去执行(先进先出)。
(历史注释:在1997年,火星车中的嵌入式系统遭遇过优先级反转问题,也许这是说明正确处理优先级和互斥锁的最昂贵示例了。想对这一事件的背景知识有更多的了解,可以看这个网址: http://research.microsoft.com/en-us/um/people/mbj/Mars_Pathfinder/Mars_Pathfinder.html )
请添加如下的延迟方法:
先开始任务,1s钟之后cancel掉一个任务:
每个任务结束后都会有一个回调可以表示任务结束:
任务之间的从属关系:
以下来点总结:
NSOperationQueue API
查看当前并发操作的所有任务:
挂起与恢复操作:
This method suspends or resumes the execution of operations. Suspending a queue prevents that queue from starting additional operations. In other words, operations that are in the queue (or added to the queue later) and are not yet executing are prevented from starting until the queue is resumed. Suspending a queue does not stop operations that are already running.
这个方法会挂起或者恢复一个执行的任务.挂起一个队列可以阻止该队列中没有开始的任务.换句话说,在任务队列中还没有开始执行的任务是会被挂起的,直到这个挂起操作被恢复. 挂起一个队列不会让一个已经执行的任务停止哦,亲.
取消所有操作:
要取消一个队列中的所有操作,你只要简单的调用“cancelAllOperations”方法即可。还记得之前提醒过经常检查NSOperation中的isCancelled属性吗?
原因是“cancelAllOperations”并没有做太多的工作,他只是对队列中的每一个操作调用“cancel”方法 — 这并没有起很大作用!:] 如果一个操作并没有开始,然后你对它调用“cancel”方法,操作会被取消,并从队列中移除。然而,如果一个操作已经在执行了,这就要由单独的操作去识 别撤销(通过检查isCancelled属性)然后停止它所做的工作。
简单的block形式的队列任务:
以上就基本上讲完了怎么使用NSOperation以及NSOperationQueue了,亲.