演講者:
Philippe Hausler - Foundation Engineer
Dave DeLong - Frameworks Evangelist (主講)
NSOperation 基礎(chǔ)知識(shí)
正式 Session 筆記前伟葫,補(bǔ)點(diǎn)NSOperation的基礎(chǔ)知識(shí)艺蝴。
NSOperation 是什么池户?
NSOperation:NS = NextStep 前綴簡(jiǎn)寫;Operation 即操作框杜,通俗來(lái)講就是要做的事情,配合要處理的數(shù)據(jù)现喳,封裝成一個(gè)Operation怔接,執(zhí)行方式可以是并發(fā)方式(與并行略有不同)或非并發(fā)方式。
NSOperation 是抽象類凹耙,因此真正要使用它并需通過subclass姿现。Foundation框架為我們提供了 NSInvocationOperation 和 NSBlockOperation 兩個(gè)子類,當(dāng)然你可以自定義繼承實(shí)現(xiàn)肖抱!
NSOperation的幾個(gè)簡(jiǎn)單操作
前面說(shuō)到NSOperation是一個(gè)操作备典,通過發(fā)送start消息告知執(zhí)行;發(fā)送cancel消息告知正在執(zhí)行的操作取消虐沥。
// 執(zhí)行
operation.start()
// 取消
operation.cancel()
操作執(zhí)行完后還想進(jìn)行一些后續(xù)處理的話熊经,可以通過賦值 completionBlock 閉包即可:
operation.completionBlock = {
// 這些是一些操作
}
Session 正文筆記
session 分三部分講解:
- Core Concepts
- Beyond the Basics
- Sample Code
知識(shí)點(diǎn)一:maxConcurrentOperationCount
maxConcurrentOperationCount = 1
顧名思義,最大并行操作個(gè)數(shù)為1欲险,因此隊(duì)列中的操作(NSOperation)只能是一個(gè)挨一個(gè)執(zhí)行镐依。當(dāng)前僅當(dāng)前一個(gè)操作成功執(zhí)行完畢,后一個(gè)操作才能開始執(zhí)行天试。maxConcurrentOperationCount = Default
這個(gè)就有點(diǎn)意思了槐壳,會(huì)根據(jù)系統(tǒng)當(dāng)前資源來(lái)進(jìn)行合理分配,假若資源充足喜每,那么可能一下子執(zhí)行隊(duì)列中的2個(gè)操作务唐!
知識(shí)點(diǎn)二:NSOperation 生命周期
如上圖所示具有四個(gè)階段:
- Pending
- Ready
- Executing
- Finished
每一個(gè)Operation實(shí)例化都處于Pending狀態(tài)雳攘,之后依次 Ready -> Executing -> Finished 。當(dāng)然前面說(shuō)到還有個(gè)取消狀態(tài)Cancelled枫笛,這個(gè)是有限制的吨灭,只有Pending、Ready和Executing時(shí)才可以進(jìn)行取消刑巧,換句話說(shuō)除Finished不行喧兄,其他都o(jì)k!
關(guān)于取消狀態(tài),Operation 采用了一個(gè)布爾值進(jìn)行標(biāo)示:
// 注意是只讀屬性
var cancelled: Bool { get }
僅是改變狀態(tài)啊楚,Operation的子類可根據(jù)該狀態(tài)執(zhí)行對(duì)應(yīng)操作吠冤。或者就是簡(jiǎn)單調(diào)用operation.cancel()
方法即可恭理。
同理Read狀態(tài)也有個(gè)var ready: Bool { get }
來(lái)標(biāo)示拯辙。
正如下圖所示將一組處于Pending狀態(tài)的Operation放入隊(duì)列中:
此時(shí)第四個(gè)操作狀態(tài)改變了:Ready!
那么對(duì)不住了,處于ready的第一個(gè)執(zhí)行颜价!其他處于pending的待命吧涯保。
那么假若有2個(gè)operation處于ready呢?答案是按串行方式進(jìn)行執(zhí)行拍嵌,哪個(gè)在前執(zhí)行哪個(gè)遭赂。
Dependencies 依賴性
說(shuō)來(lái)理解也簡(jiǎn)單,“先做這個(gè)操作横辆,后執(zhí)行那個(gè)操作”撇他,這樣就嚴(yán)格按照了執(zhí)行了順序,而不會(huì)出現(xiàn)操作混亂的情況狈蚤,這里主要通過readiness來(lái)實(shí)現(xiàn)困肩。
代碼實(shí)例:
let operationA = ...
let operationB = ...
operationB.addDependency(operationA)
這樣不得不提及一個(gè)重要的問題:死鎖。顧名思義:就是死死鎖住了脆侮,啥都干不了了锌畸。譬如現(xiàn)在有操作A和操作B,B增加了對(duì)A的關(guān)聯(lián):僅當(dāng)A操作完成后執(zhí)行B靖避;同時(shí)A增加了對(duì)B的關(guān)聯(lián):僅當(dāng)B操作執(zhí)行完成后執(zhí)行A潭枣。這時(shí)候A和B傻眼了,都在互相等對(duì)方完成幻捏,否則啥也不干盆犁,這就造成了死鎖。
對(duì)于操作間的依賴性問題篡九,請(qǐng)勿將兩個(gè)操作進(jìn)行關(guān)聯(lián)谐岁,否則勢(shì)必造成死鎖!
之后Session主要對(duì)WWDC這個(gè)App中使用到的操作進(jìn)行了講解,太具體了也就不記錄了伊佃。有興趣地可直接去官方看視頻或下demo觀看窜司。