大家都知道的秘密是一个应用程序,瞬间响应卸载计算在后台异步完成。因此,现代的Objective-C开发者有两种选择:大中央调度或NSOperation的。
由于GCD已经相当主流,让专注于后者,面向对象的方法。
NSOperation的
代表计算的单个单元。这是一个抽象类,让子类状态,优先级,依赖,和消除模型等方面的有用的,线程安全的方式。或者,如果子类是不是你杯茶,总是NSBlockOperation
,一个具体的子类,包装业务块。
任务本身的NSOperation的
例子包括网络请求,调整图像大小,语言处理,或任何其他可重复的,结构性的,长期运行的任务,处理后的数据返回。
但是,简单包装成一个对象的计算并没有做太多,没有一点点的疏忽。这就是NSOperationQueue
用武之地。
NSOperationQueue
调节操作并发执行。它作为一个优先级队列,执行这样的操作大致先入先出的方式,具有较高的优先级(NSOperation的queuePriority的
)那些低优先级的跳跃前进。NSOperationQueue
执行操作的同时,选项可以同时执行(maxConcurrentOperationCount
)的最大数量限制。
要揭开序幕的NSOperation
,你可以调用启动
,或将它添加到NSOperationQueue
,它会自动开始操作,当它到达队列前面。
走吧NSOperation的
不同部位,描述如何使用它们,以及如何实现它们在子类中:
州
NSOperation的
编码相当优雅的状态机来描述执行的操作:
的IsReady
→ → isFinished的
isExecuting
代替一个明确的国有
财产,国家确定隐含通过KVO那些keypaths的通知。也就是说,是准备要执行的操作时,它发送一个国际志愿者组织的IsReady
码路径,其对应的属性,然后返回YES
通知。
每个属性必须是相互排斥的,从一个另一个在为了编码一致的状态:
- 的IsReady
:返回“ 是“,
以表示该操作已准备好执行,或者,如果为“ 否“
有一些还没有完成初始化步骤,它是依赖。 - isExecuting
:返回YES
如果操作是目前工作在它的任务,否则“ 或“ 否“
。 - isFinished的
回报是
如果操作的任务顺利执行完毕,或如果该操作已被取消。一个NSOperationQueue
不isFinished的
变化是
,直到队列中取出的操作,因此它是至关重要的正确,以便实现这个无法避免死锁。
消除
这可能是有用的早期取消操作被执行,以防止不必要的工作。取消的原因可能包括明确的用户操作,或未能在相关的操作。
类似的执行状态,NSOperation的
通信取消状态的变化,通过志愿的isCancelled
码路径。当操作响应取消
命令,它应该清理的任何内部细节,并尽可能快地到达一个合适的最终状态。具体而言,两个isCancelled
isFinished的
值需要变成“ YES“
,并且该值的isExecuting
序号
。
有一件事一定要注意的是围绕“取消”一词拼写的特殊性。虽然拼写不同方言之间,当它涉及到的NSOperation
:
- 取消
的方法使用一个L(动词) - isCancelled
:使用两个L's的财产(形容词)
优先
所有操作可能无法享受同样重要。将促进设置queuePriority
属性或在一个NSOperationQueue
根据以下排名推迟的操作:
- NSOperationQueuePriorityVeryHigh
- NSOperationQueuePriorityHigh
- NSOperationQueuePriorityNormal
- NSOperationQueuePriorityLow
- NSOperationQueuePriorityVeryLow
此外,操作可以指定一个的值的ThreadPriority
,这是一个值,该值介于0.0
和1.0之间
,其中1.0
表示最高优先级。鉴于queuePriority
确定的顺序操作开始,的的ThreadPriority
指定分配的计算,一旦操作已经开始。但与大多数线程的细节,如果你不知道那是什么,你可能并不需要知道一下也无妨。
依赖关系
根据您的应用程序的复杂性,它可能是有意义,瓜分大任务分解成一系列的组合的子任务。你可以做使用NSOperation的
依赖。
例如,要描述的过程中,从服务器下载和调整图像大小,你可能会想瓜分网络为一个操作和调整到另一个(或许重用下载其他资源的联网运行,或重用调整操作的图像已经在磁盘上)。然而,不能调整大小的图像,直到其下载。因此,我们说的网络操作是依赖调整大小的操作,前必须完成调整大小操作就可以开始。以代码:
[resizingOperation addDependency:networkingOperation];
[operationQueue addOperation:networkingOperation];
[operationQueue addOperation:resizingOperation];
操作将无法启动,直到所有依赖返回YES
isFinished的
。重要的是要记住的依赖关系图中所涉及的所有的操作添加到操作队列,以免沿途的某个地方一定的差距。
另外,确保不会意外产生依赖关系循环,使得A依赖于B,和B依赖于A,例如。这将创建死锁和悲伤。
completionBlock
一个非常有用的功能中添加了块复兴的iOS 4和雪豹是财产completionBlock
。
一个NSOperation的
完成时,它将执行其正是completionBlock
一次。这提供了一个非常好的方法,模型中使用自定义的操作行为时,或查看控制器。例如,你可以在网络上完成块操作块做一些与服务器的响应数据,一旦其完成加载。
NSOperation的
仍然是一个必不可少的工具,在现代的Objective-C程序员一袋招数。而GCD线异步处理的理想选择,NSOperation的
提供更全面的,面向对象的模型的计算,这是理想的封装周围结构,可重复的任务,在应用程序中的所有数据。将它添加到你的下一个项目,不仅是对你的用户带来喜悦,但自己!