IOS 多線程

多線程
為什么需要多線程? 將太多耗費時間的操作放在主線程執(zhí)行,會造成主線程堵塞,帶來極差的用戶體驗。多線程是防止主線程堵塞,增加運行效率的最佳方法
一. GCD
1.簡介:
(1) GCD基于C語言
(2) GCD會自動管理線程的生命周期(創(chuàng)建線程,調(diào)度任務(wù),銷毀線程)
(3)GCD的一個重要概念是隊列: 將長期運行的任務(wù)分拆成多個工作單元,將這些單元添加到dispath queue中,系統(tǒng)會為我們管理這些dispath queue

2.GCD的運用
(1) 使用dispatch_get_current_queue函數(shù)作為調(diào)試用途,或者測試當(dāng)前queue的標(biāo)識
(2) 使用dispatch_get_main_queue函數(shù)獲得應(yīng)用主線程關(guān)聯(lián)的串行dispatch
(3) 使用dispatch_get_global_queue來獲得共享的并發(fā)queue

3.GCD的優(yōu)點
(1) 易用: GCD比之thread跟簡單易用,基于block的血統(tǒng)導(dǎo)致它能極為簡單得在不同代碼作用域之間傳遞上下文。
(2) 效率: GCD被實現(xiàn)得如此輕量和優(yōu)雅,使得它在很多地方比之專門創(chuàng)建消耗資源的線程更實用且快速
(3) 性能: GCD自動根據(jù)系統(tǒng)負(fù)載來增減線程數(shù)量,這就減少了上下文切換以及增加了計算效率。

4.GCD的并行隊列
1.簡介: 讓多個任務(wù)并發(fā)執(zhí)行(并發(fā)功能只在異步函數(shù)下才有效,因為異步函數(shù)才具備開啟新線程的能力)

5.GCD的串行隊列
1.簡介: 讓任務(wù)一個接著一個地執(zhí)行(一個任務(wù)執(zhí)行完畢后,再執(zhí)行下一個任務(wù))(使用sync函數(shù)往當(dāng)前串行隊列中添加任務(wù),會卡在當(dāng)前串行隊列)
2.獲取串行的途徑:
(1) 使用dispatch_queue_create函數(shù) : dispatch_queue_tqueue = dispatch_queue_create(“隊列名稱”,NULL);
(2) 使用主隊列(GCD自帶的串行隊列) : 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(隊列組): 異步執(zhí)行多個耗時操作,等多個耗時操作執(zhí)行完畢之后,再回到主線程執(zhí)行操作
(4) dispatch_barrier_async(柵欄)
<1>攔截前面的任務(wù),只有先添加到隊列中的任務(wù)等于”執(zhí)行完畢”,才會執(zhí)行柵欄添加的任務(wù)
<2>如果柵欄后面還有其他任務(wù),那么必須等柵欄任務(wù)執(zhí)行完畢之后才會執(zhí)行后面的其他任務(wù)
<3>如果要使用柵欄,那么所有的任務(wù)都必須添加到同一隊列中
(5) dispatch_after(延時執(zhí)行)
(6) dispatch_once(執(zhí)行一次)
(7) dispatch_apply(快速迭代遍歷)

二. NSOpration
1.簡單說明: NSOperation 和 NSOperationQueue 實現(xiàn)多線程編程,自動執(zhí)行操作,自動開啟線程

2.實現(xiàn)步驟:
(1)先將需要執(zhí)行的操作封裝到一個NSOperation對象中
(2)將NSOperation對象添加到NSOperationQueue對象中
(3)系統(tǒng)會自動將NSOperationQueue中的NSOperation取出來
(4)將取出來的NSOperation封裝的操作放到一個新的線程執(zhí)行

3.NSOperation的子類
(1) NSInvocationOperation
(2) NSBlockOperation
(3) 自定義子類繼承NSOperation,實現(xiàn)內(nèi)部響應(yīng)的方法

4.功能
(1)并發(fā)數(shù): 同時執(zhí)行的任務(wù)數(shù),可設(shè)置最大并發(fā)數(shù)
(2)隊列的取消、暫停和恢復(fù)
(3)設(shè)置NSOperation 在queue中的優(yōu)先級,可以改變操作的執(zhí)行優(yōu)先級
(4)NSOperation 之間可以設(shè)置依賴來保證執(zhí)行順序
(5)可以監(jiān)聽一個操作的執(zhí)行完畢

三.NSThread
1.簡介: 是三種方法里面相對輕量級的,但需要管理線程的生命周期、同步、加鎖問題,這會導(dǎo)致一定的性能開銷
2.優(yōu)點: NSThread比其他兩種多線程方案較輕量級,更直觀地控制線程對象
3.缺點: 需要自己管理線程的生命周期,線程同步。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 歡迎大家指出文章中需要改正或者需要補(bǔ)充的地方,我會及時更新,非常感謝。 一. 多線程基礎(chǔ) 1. 進(jìn)程 進(jìn)程是指在系...
    xx_cc閱讀 7,236評論 11 70
  • .一.進(jìn)程 進(jìn)程:是指在系統(tǒng)中正在運行的一個應(yīng)用程序,每個進(jìn)程之間是獨立的,每個進(jìn)程均運行在其專用且受保護(hù)的內(nèi)存空...
    IIronMan閱讀 4,527評論 1 33
  • 本篇博客共分以下幾個模塊來介紹GCD的相關(guān)內(nèi)容: 多線程相關(guān)概念 多線程編程技術(shù)的優(yōu)缺點比較? GCD中的三種隊列...
    有夢想的老伯伯閱讀 1,031評論 0 4
  • 多線程 在iOS開發(fā)中為提高程序的運行效率會將比較耗時的操作放在子線程中執(zhí)行,iOS系統(tǒng)進(jìn)程默認(rèn)啟動一個主線程,用...
    郭豪豪閱讀 2,617評論 0 4
  • 在1.6中為Array新增了幾個方法map(),filter(),some(),every(),forEach()...
    憶飛閱讀 689評論 0 1