多線程之 Operation Queue 與 GCD


前言

在iOS 開發(fā)中, 實(shí)現(xiàn)多線程方案有:Operation Queue 、GCD、NSTread 。而大家經(jīng)常哪來對比的便是NSOperationQueue 與 GCD。這里我結(jié)合代碼對兩者進(jìn)行一次分析比較。歡迎大家轉(zhuǎn)載注明出處,關(guān)注我的簡書 Alan1_iOS。

基礎(chǔ)概念

Operation Queue :是NSOperation 和 NSOperationQueue 的統(tǒng)稱

GCD:Grand Central Dispatch,包含了Dispatch Queues 和 Dispatch Source。

兩者間的關(guān)系

Operation Queue 是基于GCD封裝的抽象類,目的是為了提高靈活度,以滿足多線程操作頻繁、靈活度要求高的復(fù)雜場景。

兩者間的區(qū)別


1、實(shí)現(xiàn)多線程任務(wù)方式

GCD 是一個用于多核編程的輕量級底層解決方案,可以理解成是底層的C語言構(gòu)成的API,通過block實(shí)現(xiàn)多線程任務(wù),實(shí)現(xiàn)代碼簡潔。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

//異步下載圖片代碼

dispatch_async(dispatch_get_main_queue(), ^{

//返回主線程顯示圖片代碼

});

});


?NSOperation及NSOperationQueue是基于GCD封裝的OC對象,作為對象可以提供更多操作選擇,可以用方法或block實(shí)現(xiàn)多線程任務(wù),同時也可以利用繼承、類別等進(jìn)行一些其他操作;但同時實(shí)現(xiàn)代碼相對復(fù)雜一些。

NSInvocationOperation*invocationOperation = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(invocationOperationAction)object:nil];

NSBlockOperation*blockOperation = [NSBlockOperationblockOperationWithBlock:^{

//任務(wù)代碼

}];

NSOperationQueue*queue = [[NSOperationQueuealloc]init];

queue.maxConcurrentOperationCount=10;

[queueaddOperation:blockOperation];

[queueaddOperation:invocationOperation];

2、功能靈活性

NSOperation: 可以給 Operation 之間添加依賴關(guān)系,這樣的話盡管兩個Operation處于同一個并行隊(duì)列中,但前者會直到后者執(zhí)行完畢后再執(zhí)行,設(shè)置優(yōu)先級也可以改變執(zhí)行順序;也可以對一個正在執(zhí)行的 Operation 進(jìn)行取消、暫停和恢復(fù)操作;還可以通過KVO對線程任務(wù)進(jìn)行監(jiān)聽。

[blockOperationaddDependency:invocationOperation];

[blockOperationsetQueuePriority:NSOperationQueuePriorityNormal];

[queuecancelAllOperations];

[blockOperationcancel];

[blockOperationstart];


GCD:可以在串行隊(duì)列和并發(fā)隊(duì)列上,通過同步提交任務(wù)和異步提交任務(wù)兩種方式操作多線程任務(wù)的執(zhí)行任務(wù),但是不能夠取消、暫停、恢復(fù)多線程任務(wù)以及監(jiān)聽,只能簡單地執(zhí)行任務(wù)。

3、性能

GCD 是C語言底層實(shí)現(xiàn),相對與NSOperation ,性能消耗會少一些。Operation Queue 為了提高靈活度在性能方面有所消耗。


總結(jié)

? ? ? 在對線程操作靈活度要求高的框架以及需面對隨時更換的需求時采用Operation Queue,能夠提高代碼的擴(kuò)展性,更為合理;而在普通簡單實(shí)用多線程場景下,例如普通的異步加載圖片等采用GCD,在代碼簡潔的情況下還能節(jié)省性能消耗。




最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容