如何自定义一个NSOperation

基础框架提供了两个内置的NSOperation的子类,但是这两个内置的操作不一定能够满足我们的实际的需要,比如我们需要一个完成一个网络请求的操作,里面可能会有许多自定义的逻辑在里面,为了完成这些特有的逻辑,往往需要自定义一个NSOperation的子类来。


NSOperation类本身实现了许多与自定义有关的东西,我们只需要做相对较少的工作就可以了,自定义一个非并发的操作相对简单,只需要处理需要做的逻辑,并且处理取消操作就可以,其他的都不需要做了。但是自定义一个并发的操作相对难度较大,需要做的东西也比较多。

如果块操作和调用操作对象不完全满足应用程序的需要,你可以直接子类NSOperation并添加您需要的任何行为。NSOperation的类提供了一个通用的子类的所有操作对象。类还提供了大量的基础设施来处理依赖关系和KVO所需的大部分工作通知。然而,有时可能仍然需要补充现有的基础设施,以确保操作正确的行为。额外的工作你要做的数量取决于你是否正在实施nonconcurrent或并发操作。


定义一个nonconcurrent操作比定义一个简单的并发操作。nonconcurrent操作,所有你要做的就是正确的执行你的主要任务和回应取消事件;现有的类基础设施为你做所有的其他工作。对于并发操作,您必须替换现有的一些基础设施与您的自定义代码。以下部分向您展示了如何实现这两种类型的对象。


不管是什么类型的操作,必须要做的一件事情就是执行需要的任务,这是操作存在的最基本的意义。


至少每一个操作对象至少要实现以下方法:

1,一个自定义的初始化方法


2,主要


您需要一个自定义的初始化方法把操作对象到一个已知状态,一个定制的主要方法来执行你的任务。你可以根据需要实现额外的方法,当然,如以下:


1,定制方法,你打算调用实现的主要方法。


2,用来设置数据值的取值方法和访问操作的结果。


3, NSCoding协议的方法让你存档和unarchive操作对象。


下面的代码显示了一个起始模板自定义NSOperation子类。(这个清单不显示如何处理取消但是你通常会显示方法。处理取消的信息,请参阅“应对取消事件”)这个类的初始化方法需要一个数据对象作为参数和商店里面操作对象的引用。数据对象的主要方法表面上工作之前返回结果返回给应用程序。


定义一个简单的操作对象。


@ interface MyNonConcurrentOperation: NSOperation

@ property id(强)myData;


——(id) initWithData: (id)数据;


@end


@ implementation MyNonConcurrentOperation 

——(id) initWithData: (id)数据{

,,,,如果(自我=(超级init)) {

,,,,,,,, myData=https://www.yisu.com/zixun/data;

,,,,}


,,,,回归自我;

}


- (void)主要{

,,,, @try {

,,,,,,,,//myData做一些工作,并报告结果。

,,,, @catch (…) {

,,,,,,,,//不重新抛出异常。

,,,,}

}



@end


详细的例子,如何实现一个NSOperation子类,看到NSOperationSample。


除了添加完成必须工作的主方法之外,还必须要处理取消相关的逻辑,支持取消是NSOperation很重要的一部分能力。



操作开始执行后,继续执行其任务,直到完成为止,直到代码显式地取消操作。取消随时可能发生,甚至在手术开始前执行。虽然NSOperation类提供了一种方法为客户取消操作,认识到取消事件是自愿的,必要的。如果一个操作被完全终止,可能没有办法回收资源分配。因此,操作对象将检查取消事件和优雅地退出时发生的操作。


支持取消操作对象,你所要做的是调用对象的isCancelled方法定期从你的自定义代码,如果它曾经返回是的立即返回。null

如何自定义一个NSOperation