WWDC 2015 - Session 226 - Advanced NSOperations

演讲者:
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 生命周期

lifecycle.png

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

  • Pending
  • Ready
  • Executing
  • Finished

每一个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观看。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容