Concurrency Programming Guide 并发设计指引(五) Operation Queues

来源:互联网 发布:淘宝联盟怎么加优惠券 编辑:程序博客网 时间:2024/06/06 00:22

以下翻译是本人通过谷歌工具进行翻译,并进行修正后的结果,希望能对大家有所帮助。如果您发现翻译的不正确不合适的地方,希望您能够发表评论指正,谢谢。转载请注明出处。相关的英文原文在以后的文章中省略,直接贴翻译。

OperationQueues

CocoaOperations是一个面向对象的方式来封装要异步执行工作。Operations被设计成结合操作队列(OperationQueue)使用,也可以自己单独使用。因为他们是基于Objective-C中,在OSXiOSOperations最常用于基于Cocoa的应用程序。

本章将告诉您如何定义和使用Operations


关于Operation 对象


Operation对象是NSOperation类的一个实例(Foundation框架),去封装你希望你的应用程序执行的工作。为了做一些有用的工作,NSOperation的类本身是一个必须被继承抽象基类。尽管抽象,这个类提供了一个重大的基础设施,以减少大量的工作,这些工作你必须在自己的子类中完成。此外,Foundation框架提供了两个具体的子类,您可以使用您现有的代码。表2-1列出了这些课程,以及与您如何使用任意一个子类的总结。

NSInvocationOperation

从你的应用中用来创建一个基于对象和选择器的operation对象。您有一个现有的方法已经执行所需的任务的情况下,您可以使用这个类。因为它并不需要子类,你也可以使用这个类来创建一个更加时尚动感的操作对象。有关如何使用这个类的信息,Creatingan NSInvocationOperation Object.”

NSBlockOperation

用来并发执行一个或多个blockobjects。因为它可以执行多个block,所以一个blockOperation可以用一个语义组。只有当所有相关的blocks执行完毕,Operation操作本身认为执行完成。更多的使用信息请看Creatingan NSBlockOperation Object.”。这个类在OSX v10.6以及以后都是合法的。更多关于blocks的信息请查看BlocksProgramming Topics

NSOperation

自定义Operation对象的基类。继承NSOperation可以给你自己的Operation完全的控制,包括改变你的Operation执行和报告自身状态的默认方式。如何自定义operation对象请看Defininga Custom Operation Object.”

所有的Operation对象支持以下特性:

  • 支持建立基于图形的操作对象之间的依赖关系。这些依赖防止给定的操作运行,直到它依赖的所有的操作都完成运行。有关如何配置依赖关系的信息,请参阅ConfiguringInteroperation Dependencies.”

  • 支持可选的完成块(completionblock),这是主要任务完成后执行的操作。完成块(completionblock)如何设置信息参阅SettingUp a Completion Block.”

  • 支持用KVO通知监听你的operations执行状态改变。KVO的信息请参阅Key-ValueObserving Programming Guide.

  • 支持优先操作,从而影响它们的相对执行顺序。更多信息请参阅Changingan Operation's Execution Priority”.

  • 支持取消语义,允许你停止一个正在执行的Operation。更多关于取消Operation信息请参阅CancelingOperations”,更多关于支持自定义operations的取消请参阅Responding to Cancellation Events.”


Operations被设计用来帮你在应用中提高并发级别。Operations也是一个很好的方式来组织和封装您的应用程序的行为,使它变成简单的离散块。你可以提交一个或多个Operation对象到队列,让一个或多个独立的线程异步执行相应的工作,而不是您的应用程序的主线程上执行一堆的代码。


Concurrent VersusNon-concurrent Operations

虽然您通常通过将它们添加到一个操作队列执行操作,但这样做不是必需的。它也可以手动执行Operation对象通过调用它的start方法,但这样做并不能保证其余的代码操作同时运行。NSOperation类的isConcurrent方法告诉你是否一个Operation同步或异步运行当相关线程中start方法被调用时。默认情况下,这个方法返回NO,这意味着在调用线程中操作同步运行。


如果你想实现并发操作是异步运行就调用线程,你必须写额外的代码来启动异步操作。例如,你可能会产生一个单独的线程,调用异步系统功能,或做任何事情,以确保开始方法立即启动任务并返回,在所有的可能性,在任务完成之前。


大多数开发者应该永远不需要实现并发操作对象。如果你总是到一个操作队列中添加您的业务,你不需要来实现并行操作。当你提交一个非即时性的操作到一个操作队列中,队列本身创建一个线程,在其上运行您的操作。因此,增加一个非即时性的操作到操作队列仍然导致操作对象代码的异步执行。当您需要异步执行的operation不将它添加到OperationQueue中的时候,定义并发操作才是必须的。更多的关于创建并发操作请参阅“ConfiguringOperations for Concurrent Execution” and NSOperation ClassReference

未完待续......