Marc StevenCoder
Jul 23, 2017 · 4 min read

NSOpertaion是一个类 -允许你去捆绑一系列的工作,然后在将来在某种程度上去执行它,如果你熟悉命令行设计模式,你将会基本上视NSOpertion为一个命令对象。你通过设计你的算法然后转换它进入一个NSOpertion去出发。这个operation有一个状态machine去呈现它的生命周期。
一旦一个NSOperation被实例化,它将会转换到一个准备的状态,在某种程度上而言,一些事情将会调用开始的方法,在另外的方面,它将会移动到执行的状态,从执行的状态,这个operation能以二种方式中的一种去运行。
1,如果取消的方法被调用,在移动到一个完成的状态之前,它将会转换到取消的状态。
2,如果这个操作不被取消,然后事实上它将会转换到完成的状态。

屏幕快照 2017-07-23 上午10.54.05

你可以通过NSOpertaion API看这个生命周期如何显示

屏幕快照 2017-07-23 上午10.56.20

这些所有都符合KVO,因此对于状态的转变你能注册去接收通知。
方式中的一种:你可以对于一个操作提供函数去子类化NSOperation。在简单的场景中,这和重写main方法一样简单。NSOperation基类帮你处理所有的状态转换。
在将来的教程中,你将会手动处理opertation,你能提供一个闭包-当操作完成,则被调用(沿用service等级quality一起)
底层的线程运行于不同的优先级等级-允许scheduler去在其他的线程之上去优先处理一些线程。优先级等级是十分困难的-和错误一起工作或者充满错误,其中需要优先级跳转。

Quality Of Service

苹果已经抽象了优先级的概念到一个以QualityOfService的概念

屏幕快照 2017-07-23 上午11.10.01


这个允许你去根据自己的意图去配置,然后使用scheduler去决定如何横穿大量的resource去同时应付优先级。
QualityOfService 通过QualityOfService的枚举来呈现,并且有一个值。

UserInteractive

用户直接交互的一些任务,例如scrollview的渲染

UserInitiated

用户立刻需要的一些任务,但是不能直接渲染到screen上,例如打开一个document

Utility

用户将用一个spinner(等着它们完成)来呈现的一些任务,例如下载数据

background

用户不直接关心的一些任务,例如同步数据到远程的服务器或者清除一个数据仓库

Default

介于userInitiate和Utility之间
除此之外,子类化NSOperation,你能创建一个operation去呈现你的任务(使用NSBlockOpertaion)

public class NSBlockOperation:NSOperation {
public convenience init(block:()->Void)
public func addExecutionBlock(block:() ->Void)
public var executionBlocks:[()->Void] {get}
}

上面是一个NSOperation的具体子类化,带了一个或者多个闭包,当block被调用的时候,则运行它们

Marc StevenCoder

Written by

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade