NSOperation学习笔记

来源:互联网 发布:基恩士视觉软件 编辑:程序博客网 时间:2024/05/17 03:25

NSOperation是一个抽象类,用于封装一个任务(包括代码和数据),和NSOperaionQueue一起工作,提供了一个线程安全的多线程机制;

使用:子类化一个NSOperation,或者使用系统提供的operation(NSInvocationOperation or NSBlockOperation);把operation加入到一个NSOperationQueue中即可。

也可以手动调用operation的start方法,但如果此时operation不在ready状态(依赖其他operation时),会触发异常;


operation dependencies:

一个Operaion可以依赖其他Operation(addDependency or remove dependence),由此可以构造一个operaions的执行顺序;

只有当一个operation他依赖的所有operation都finished后,这个operation才处于ready状态;

一个operation进入finished状态,并不一定代表他一定完成了某个任务(如cancel一个请求也可以使一个operation进入finished状态),但NSOperation机制对这种情况并不加以区分(只是简单地认为operation已经完成了,可以进行下一个任务了),这时就需求使用者做额外的工作了(如追踪判断前面的任务的执行情况),来决定下一个operation应该如何执行。


KVO-compliant properties

nsoperation的一些属性,是服从KVO机制的

  • isCancelled - read-only

  • isAsynchronous - read-only

  • isExecuting - read-only

  • isFinished - read-only

  • isReady - read-only

  • dependencies - read-only

  • queuePriority - readable and writable

  • completionBlock - readable and writable

如果你子类化了一个operation,你也需要实现相应的KVO和KVC


Asynchronous Versus Synchronous Operations

synchronous:调用start方法,该operation就在当前线程同步执行,直到start方法返回;
asynchronous:吧operation加入queue,queue会启动一个线程来执行该operation,该方法也是在start方法返回时,认为该任务执行完成,但如果该任务是一个异步任务(如异步网络请求)时,其实该任务还并没有完成呢,在这种情况下,需要使用者跟踪任务的执行状态,并在任务状态变化时使用KVO通知。


subclassing note:

要根据你要实现同步还是异步的operation:
同步:只需要实现main方法即可;
异步:至少实现:

方法

描述

start

(必选)所有的并发Operation必需重写这个方法并且要实现这个方法的内容来代替原来的操和。手动执行一个操作,你可以调用start方法。因此,这个方法的实现是这个操作的始点,也是其他线程或者运行这你这个任务的起点。注意一下,在这里永远不要调用[super start]。

main

(可选)这个方法就是你的实现的操作

isExecuting 和 isFinish

(必选)并发队列负责维持当前操作的环境和告诉外部调用者当前的运行状态。因此,一个并发队列必需维持保持一些状态信息以至于知道什么时候执行任务,什么时候完成任务。它必须通过这些方法告诉外部当前的状态。这种而且这些方法必须是线程安全,当状态发生改变的时候,你必须使用KVO通知监听这些状态的对象。

isConcurrent

(必选)定义一个并发操作,重写这个方法并且返回YES

在修改任务状态的时候,要发出KVO通知


maintaining operation object states:

isReady
isExecuting
isFinished
idCancelled
当子类化nsoperation的时候要重写这些方式,并在改变他们的值的时候发出KVO通知


Responding to the cancel command:

cancel一个operation,并不一定会终止该任务,如当前任务正好执行完成,或者正在执行。对Operaion调用cancel,只会让该任务尽快进入调用start方法,这是就需要使用者在start方法中做判断,如果该任务已经cancel就不执行任务,并将状态置为finished(系统提供的operation已经实现了这一功能)。如果任务正在执行,那需要使用者手动的先结束任务,在把任务的状态置为finished(如cancel一个网络请求,在cancel方法中先把connection cancel掉,在把operation的状态置为finished)。


NSOperation vs. GCD

GCD 是一个低层次的 C API,能让开发者并行执行任务。与之相对,Operation queues 是对队列模型的高层级抽象,NSOperation 是在 Cocoa 框架下基于 GCD 的封装,相对于 GCD 来说可控性更强,并且加入了一些方便的功能(取消任务、设置依赖、设置最大并发等等)。GCD 中的关键概念 —— 任务和队列,正好对应了 NSOperation和 NSOperationQueue 两个类,因此在开始 NSOperation 的学习之前,我建议先对 GCD 的基本思想和核心概念有所掌握。

同时,我也知道,NSOperation 是对 GCD 更高层次的封装,所以它有着一些 GCD 无法实现(或者至少说很难实现)的特性:
取消任务
设置依赖
优先级:
设置并发数

0 0
原创粉丝点击