NSOperation

来源:互联网 发布:linux下常用软件 编辑:程序博客网 时间:2024/04/27 19:39

      

       NSOperation类是一个用于压缩一个任务中的代码和数据的抽象类。一般使用这个类的预定义子类NSInvocationOperation或NSBlockOperation,或者自定义子类来执行实际的任务。在NSOperation类中包含了保证任务的安全执行的逻辑。这个内建的机制省了很多事。

     operation对象是一次性的,只执行设定的任务一次。一般来说,NSOperation对象要与NSOperationQueue一起使用。一个操作队列不直接执行其中的操作,而是将其放入另一个线程执行,或者间接使用libdispatch类(Grand Central Dispatch)。想了解更多关于操作队列的说明,请猛击NSOperationQueue Class Reference.
     可以直接调用start方法运行NSOperation对象中的操作。手动管理很麻烦。

操作依赖
     使用操作依赖可以很方便地按指定顺序执行操作。可以使用addDependency:和removeDependency:方法管理依赖。只有依赖的操作都完成了,指定操作才会准备好。
     操作依赖与依赖的操作是否成功无关,只与是否结束有关。也就是说,取消一个操作也会使操作的状态标记为已结束。

键值观察属性
     NSOperation类有几个属性是符合键值绑定和键值观察的。如果需要,可以通过观察这几个属性来控制应用的其他模块。符合的属性有:
1.isCancelled     read-only
2.isConcurrent   read-only
3.isExecuting     read-only
4.isReady          read-only
5.dependencires  read-only
6.queuePriority     read-write
7.completionBlock  read-write
     尽管可以观察这些属性,但是不能用cocoa binding绑定到应用的用户界面。与用户界面有关的代码都应该在主线程中执行。因为一个operation可以在任何线程中执行,键值观察的提示也可能发生在其他线程。
     在重写这些属性时,也应该遵守kvc和kvo协议,如果增加了属性,最好也遵守这两个协议。

多核时的情况
     NSOperation类已经做了多核处理,所以不必为多线程增加额外的同步锁。operation一般都运行于创建线程之外。
     当继承NSOperation时,需要保证重写的方法是线程安全的。因此,在operation中操作任何数据都应当保证线程安全。

并发操作与非并发操作
     如果打算手动执行一个operation,则可以设置操作是并发或非并发的。operation对象默认是非并发的。在一个非并发操作中,operation的任务是同步执行的,也就是在一个线程中。当调用一个非并发操作对象的start方法时,操作会立即在当前线程中执行。当从start方法返回时,任务就结束了。
     非并发操作是异步执行的,也就是说,当调用start方法后,任务还没结束可能start方法就返回了。这种情况发生于operation对象创建了一个新线程执行任务或者operation调用了一个异步函数。
     如果使用操作队列执行操作,使用非并发更简单。如果手动执行操作,可能需要设置操作为并发的,以确保操作能异步执行。使用并发的操作队列很费劲,因为需要监视任务的运行状态,并使用KVO传递消息。使用并发操作可以防止手动执行的操作错住调用进程。

继承须知
     对于非并发操作,一般只重写一个方法:
main
     在这个方法中放置需要执行指定任务的代码。
     
对于并发操作,至少需要重写以下方法:
1.start
2.isConcurrent
3.isExecuting
4.isFinished
     在并发操作中,start负责在异步模式中启动操作。不管是建立新线程还是调用异步函数,都应该在这完成。同时也要在start中更新isExecuting方法返回的操作状态。可以通过设置向isExecuting的键路径发送KVO通知实现,从而使外部可以得到操作的运行状态。

     除了结束或取消任务,并发操作对象一定要向isExecuting和isFinished键路径发送通知来标记操作的最后改变状态。
     在start方法中绝对不能使用super。在定制并发操作时,应该自己完成start中的所有功能。而不能使用超类的实现。start方法在开启任务前应该先确认是否被取消了。
0 0
原创粉丝点击