多線程
為什么需要多線程? 將太多耗費(fèi)時(shí)間的操作放在主線程執(zhí)行,會(huì)造成主線程堵塞,帶來(lái)極差的用戶體驗(yàn)啸驯。多線程是防止主線程堵塞,增加運(yùn)行效率的最佳方法
一. GCD
1.簡(jiǎn)介:
(1) GCD基于C語(yǔ)言
(2) GCD會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程,調(diào)度任務(wù),銷毀線程)
(3)GCD的一個(gè)重要概念是隊(duì)列: 將長(zhǎng)期運(yùn)行的任務(wù)分拆成多個(gè)工作單元,將這些單元添加到dispath queue中,系統(tǒng)會(huì)為我們管理這些dispath queue
2.GCD的運(yùn)用
(1) 使用dispatch_get_current_queue函數(shù)作為調(diào)試用途,或者測(cè)試當(dāng)前queue的標(biāo)識(shí)
(2) 使用dispatch_get_main_queue函數(shù)獲得應(yīng)用主線程關(guān)聯(lián)的串行dispatch
(3) 使用dispatch_get_global_queue來(lái)獲得共享的并發(fā)queue
3.GCD的優(yōu)點(diǎn)
(1) 易用: GCD比之thread跟簡(jiǎn)單易用,基于block的血統(tǒng)導(dǎo)致它能極為簡(jiǎn)單得在不同代碼作用域之間傳遞上下文饺律。
(2) 效率: GCD被實(shí)現(xiàn)得如此輕量和優(yōu)雅,使得它在很多地方比之專門創(chuàng)建消耗資源的線程更實(shí)用且快速
(3) 性能: GCD自動(dòng)根據(jù)系統(tǒng)負(fù)載來(lái)增減線程數(shù)量跺株,這就減少了上下文切換以及增加了計(jì)算效率复濒。
4.GCD的并行隊(duì)列
1.簡(jiǎn)介: 讓多個(gè)任務(wù)并發(fā)執(zhí)行(并發(fā)功能只在異步函數(shù)下才有效,因?yàn)楫惒胶瘮?shù)才具備開啟新線程的能力)
5.GCD的串行隊(duì)列
1.簡(jiǎn)介: 讓任務(wù)一個(gè)接著一個(gè)地執(zhí)行(一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù))(使用sync函數(shù)往當(dāng)前串行隊(duì)列中添加任務(wù),會(huì)卡在當(dāng)前串行隊(duì)列)
2.獲取串行的途徑:
(1) 使用dispatch_queue_create函數(shù) : dispatch_queue_tqueue = dispatch_queue_create(“隊(duì)列名稱”,NULL);
(2) 使用主隊(duì)列(GCD自帶的串行隊(duì)列) : dispatch_queue_tqueue = dispatch_get_main_queue();
6.GCD詳解
(1) dispatch_async(異步任務(wù)) :可以在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力
(2) dispatch_sync(同步任務(wù)): 只能在當(dāng)前任務(wù)中執(zhí)行任務(wù),不具備開啟新線程的能力
(3) dispatch_group_t(隊(duì)列組): 異步執(zhí)行多個(gè)耗時(shí)操作,等多個(gè)耗時(shí)操作執(zhí)行完畢之后,再回到主線程執(zhí)行操作
(4) dispatch_barrier_async(柵欄)
<1>攔截前面的任務(wù),只有先添加到隊(duì)列中的任務(wù)等于”執(zhí)行完畢”,才會(huì)執(zhí)行柵欄添加的任務(wù)
<2>如果柵欄后面還有其他任務(wù),那么必須等柵欄任務(wù)執(zhí)行完畢之后才會(huì)執(zhí)行后面的其他任務(wù)
<3>如果要使用柵欄,那么所有的任務(wù)都必須添加到同一隊(duì)列中
(5) dispatch_after(延時(shí)執(zhí)行)
(6) dispatch_once(執(zhí)行一次)
(7) dispatch_apply(快速迭代遍歷)
二. NSOpration
1.簡(jiǎn)單說(shuō)明: NSOperation 和 NSOperationQueue 實(shí)現(xiàn)多線程編程,自動(dòng)執(zhí)行操作,自動(dòng)開啟線程
2.實(shí)現(xiàn)步驟:
(1)先將需要執(zhí)行的操作封裝到一個(gè)NSOperation對(duì)象中
(2)將NSOperation對(duì)象添加到NSOperationQueue對(duì)象中
(3)系統(tǒng)會(huì)自動(dòng)將NSOperationQueue中的NSOperation取出來(lái)
(4)將取出來(lái)的NSOperation封裝的操作放到一個(gè)新的線程執(zhí)行
3.NSOperation的子類
(1) NSInvocationOperation
(2) NSBlockOperation
(3) 自定義子類繼承NSOperation,實(shí)現(xiàn)內(nèi)部響應(yīng)的方法
4.功能
(1)并發(fā)數(shù): 同時(shí)執(zhí)行的任務(wù)數(shù),可設(shè)置最大并發(fā)數(shù)
(2)隊(duì)列的取消脖卖、暫停和恢復(fù)
(3)設(shè)置NSOperation 在queue中的優(yōu)先級(jí),可以改變操作的執(zhí)行優(yōu)先級(jí)
(4)NSOperation 之間可以設(shè)置依賴來(lái)保證執(zhí)行順序
(5)可以監(jiān)聽一個(gè)操作的執(zhí)行完畢
三.NSThread
1.簡(jiǎn)介: 是三種方法里面相對(duì)輕量級(jí)的,但需要管理線程的生命周期巧颈、同步畦木、加鎖問(wèn)題,這會(huì)導(dǎo)致一定的性能開銷
2.優(yōu)點(diǎn): NSThread比其他兩種多線程方案較輕量級(jí)砸泛,更直觀地控制線程對(duì)象
3.缺點(diǎn): 需要自己管理線程的生命周期十籍,線程同步。線程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開銷