一员淫、 Grand Central Dispatch或者GCD
Grand Central Dispatch或者GCD合蔽,是蘋(píng)果基于 C 語(yǔ)言開(kāi)發(fā)的一套低層API,提供了一種新的方法來(lái)進(jìn)行并發(fā)程序編寫(xiě)介返。從基本功能上講拴事,GCD有點(diǎn)像NSOperationQueue沃斤,他們都允許程序?qū)⑷蝿?wù)切分為多個(gè)單一任務(wù)然后提交至工作隊(duì)列來(lái)并發(fā)地或者串行地執(zhí)行。GCD比之NSOpertionQueue更底層更高效刃宵,并且它不是Cocoa框架的一部分
二衡瓶、 NSOprationQueue
NSOprationQueue是一個(gè)建立在 GCD 的基礎(chǔ)之上的,面向?qū)ο蟮慕鉀Q方案牲证。它使用起來(lái)比 GCD 更加靈活哮针,功能也更加強(qiáng)大。
三坦袍、 Grand Central Dispatch或者GCD VS NSOprationQueue
GCD以 FIFO 的順序執(zhí)行并發(fā)任務(wù)的方式十厢,使用 GCD 時(shí)我們并不關(guān)心任務(wù)的調(diào)度情況,而讓系統(tǒng)幫我們自動(dòng)處理捂齐。但是 GCD 的短板也是非常明顯的蛮放,比如我們想要給任務(wù)之間添加依賴(lài)關(guān)系、取消或者暫停一個(gè)正在執(zhí)行的任務(wù)時(shí)就會(huì)變得非常棘手辛燥。
Operation Queues :相對(duì) GCD 來(lái)說(shuō)筛武,使用 Operation Queues 會(huì)增加一點(diǎn)點(diǎn)額外的開(kāi)銷(xiāo),但是我們卻換來(lái)了非常強(qiáng)大的靈活性和功能挎塌,我們可以給 operation 之間添加依賴(lài)關(guān)系徘六、取消一個(gè)正在執(zhí)行的 operation 、暫停和恢復(fù) operation queue 等榴都;
兩者的直接區(qū)別:
- GCD是底層的C語(yǔ)言構(gòu)成的API待锈,而NSOperationQueue及相關(guān)對(duì)象是Objc的對(duì)象。在GCD中嘴高,在隊(duì)列中執(zhí)行的是由block構(gòu)成的任務(wù)竿音,這是一個(gè)輕量級(jí)的數(shù)據(jù)結(jié)構(gòu);而Operation作為一個(gè)對(duì)象拴驮,為我們提供了更多的選擇春瞬;
- 在NSOperationQueue中,我們可以隨時(shí)取消已經(jīng)設(shè)定要準(zhǔn)備執(zhí)行的任務(wù)(當(dāng)然套啤,已經(jīng)開(kāi)始的任務(wù)就無(wú)法阻止了)宽气,而GCD沒(méi)法停止已經(jīng)加入queue的block(其實(shí)是有的,但需要許多復(fù)雜的代碼)潜沦;
- NSOperation能夠方便地設(shè)置依賴(lài)關(guān)系萄涯,我們可以讓一個(gè)Operation依賴(lài)于另一個(gè)Operation,這樣的話(huà)盡管兩個(gè)Operation處于同一個(gè)并行隊(duì)列中唆鸡,但前者會(huì)直到后者執(zhí)行完畢后再執(zhí)行涝影;
- 我們能將KVO應(yīng)用在NSOperation中,可以監(jiān)聽(tīng)一個(gè)Operation是否完成或取消争占,這樣子能比GCD更加有效地掌控我們執(zhí)行的后臺(tái)任務(wù)燃逻;
- 在NSOperation中序目,我們能夠設(shè)置NSOperation的priority優(yōu)先級(jí),能夠使同一個(gè)并行隊(duì)列中的任務(wù)區(qū)分先后地執(zhí)行唆樊,而在GCD中宛琅,我們只能區(qū)分不同任務(wù)隊(duì)列的優(yōu)先級(jí),如果要區(qū)分block任務(wù)的優(yōu)先級(jí)逗旁,也需要大量的復(fù)雜代碼嘿辟;
- 我們能夠?qū)SOperation進(jìn)行繼承,在這之上添加成員變量與成員方法片效,提高整個(gè)代碼的復(fù)用度红伦,這比簡(jiǎn)單地將block任務(wù)排入執(zhí)行隊(duì)列更有自由度,能夠在其之上添加更多自定制的功能淀衣。