演讲者:
Philippe Hausler - Foundation Engineer
Dave DeLong - Frameworks Evangelist (主讲)
NSOperation 基础知识
正式 Session 笔记前,补点NSOperation的基础知识。
NSOperation 是什么?
NSOperation:NS = NextStep 前缀简写;Operation 即操作,通俗来讲就是要做的事情,配合要处理的数据,封装成一个Operation,执行方式可以是并发方式(与并行略有不同)或非并发方式。
NSOperation 是抽象类,因此真正要使用它并需通过subclass。Foundation框架为我们提供了 NSInvocationOperation 和 NSBlockOperation 两个子类,当然你可以自定义继承实现!
NSOperation的几个简单操作
前面说到NSOperation是一个操作,通过发送start消息告知执行;发送cancel消息告知正在执行的操作取消。
// 执行
operation.start()
// 取消
operation.cancel()
操作执行完后还想进行一些后续处理的话,可以通过赋值 completionBlock 闭包即可:
operation.completionBlock = {
// 这些是一些操作
}
Session 正文笔记
session 分三部分讲解:
- Core Concepts
- Beyond the Basics
- Sample Code
知识点一:maxConcurrentOperationCount
maxConcurrentOperationCount = 1
顾名思义,最大并行操作个数为1,因此队列中的操作(NSOperation)只能是一个挨一个执行。当前仅当前一个操作成功执行完毕,后一个操作才能开始执行。maxConcurrentOperationCount = Default
这个就有点意思了,会根据系统当前资源来进行合理分配,假若资源充足,那么可能一下子执行队列中的2个操作!
知识点二:NSOperation 生命周期
如上图所示具有四个阶段:
- Pending
- Ready
- Executing
- Finished
每一个Operation实例化都处于Pending状态,之后依次 Ready -> Executing -> Finished 。当然前面说到还有个取消状态Cancelled,这个是有限制的,只有Pending、Ready和Executing时才可以进行取消,换句话说除Finished不行,其他都ok!
关于取消状态,Operation 采用了一个布尔值进行标示:
// 注意是只读属性
var cancelled: Bool { get }
仅是改变状态,Operation的子类可根据该状态执行对应操作。或者就是简单调用operation.cancel()
方法即可。
同理Read状态也有个var ready: Bool { get }
来标示。
正如下图所示将一组处于Pending状态的Operation放入队列中:
此时第四个操作状态改变了:Ready!
那么对不住了,处于ready的第一个执行!其他处于pending的待命吧。
那么假若有2个operation处于ready呢?答案是按串行方式进行执行,哪个在前执行哪个。
Dependencies 依赖性
说来理解也简单,“先做这个操作,后执行那个操作”,这样就严格按照了执行了顺序,而不会出现操作混乱的情况,这里主要通过readiness来实现。
代码实例:
let operationA = ...
let operationB = ...
operationB.addDependency(operationA)
这样不得不提及一个重要的问题:死锁。顾名思义:就是死死锁住了,啥都干不了了。譬如现在有操作A和操作B,B增加了对A的关联:仅当A操作完成后执行B;同时A增加了对B的关联:仅当B操作执行完成后执行A。这时候A和B傻眼了,都在互相等对方完成,否则啥也不干,这就造成了死锁。
对于操作间的依赖性问题,请勿将两个操作进行关联,否则势必造成死锁!
之后Session主要对WWDC这个App中使用到的操作进行了讲解,太具体了也就不记录了。有兴趣地可直接去官方看视频或下demo观看。