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