关于WWDC的故事...寒哥管理的技术专题iOS

WWDC 2015 - Session 226 - Advanc

2016-03-17  本文已影响249人  NinthDay

演讲者:
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 分三部分讲解:

知识点一:maxConcurrentOperationCount

知识点二:NSOperation 生命周期

lifecycle.png

如上图所示具有四个阶段:

每一个Operation实例化都处于Pending状态,之后依次 Ready -> Executing -> Finished 。当然前面说到还有个取消状态Cancelled,这个是有限制的,只有Pending、Ready和Executing时才可以进行取消,换句话说除Finished不行,其他都ok!

cancel.png

关于取消状态,Operation 采用了一个布尔值进行标示:

// 注意是只读属性
var cancelled: Bool { get }

仅是改变状态,Operation的子类可根据该状态执行对应操作。或者就是简单调用operation.cancel()方法即可。

同理Read状态也有个var ready: Bool { get }来标示。

正如下图所示将一组处于Pending状态的Operation放入队列中:

pending.png

此时第四个操作状态改变了:Ready!

ready.png

那么对不住了,处于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观看。

上一篇下一篇

猜你喜欢

热点阅读