3C科技 娛樂遊戲 美食旅遊 時尚美妝 親子育兒 生活休閒 金融理財 健康運動 寰宇綜合

Zi 字媒體

2017-07-25T20:27:27+00:00
加入好友
一、GCD基本概念 GCD 全稱Grand Central Dispatch(大中樞隊列調度),是一套低層API,提供了⼀種新的方法來進⾏併發程序編寫。從基本功能上講,GCD有點像NSOperationQueue,他們都允許程序將任務切分為多個單一任務,然後提交⾄⼯作隊列來併發的或者串⾏的執行。GCD是C實現,⽐NSOpertionQueue更底層更高效,並且它不是Cocoa框架的一部分 併發任務會像NSOperationQueue那樣基於系統負載來合適地併發進⾏,而串⾏行隊列同一時間只執行單一任務,GCD的API很大程度上基於block。 GCD併發編程的主要好處歸納GCD可用於多核的并行運算GCD會自動利用更多的CPU內核(比如雙核、四核)GCD會自動管理線程的生命周期(創建線程、調度任務、銷毀線程)程序員只需要告訴GCD想要執行什麼任務,不需要編寫任何線程管理代碼二、GCD如何實現 GCD主要由隊列和任務兩部分來實現,蘋果官方對GCD是這樣說明的:開發者要做的只是定義想執行的任務並追加到適當的Dispatch Queue中。Dispatch Queue是執行處理的等待隊列,我們可以通過dispatch_async等API,在block語法中記述想要執行的處理並將其追加到Dispatch Queue中,Dispatch Queue是按照追加的順序進行處理(先進先出FIFO)。 多線程執行過程就是把任務放在隊列中去執行的過程。那麼在這裡我們首先回顧一下基本概念: (一)進程/線程、任務/隊列 (二)同步/非同步、併發/并行 併發不一定等於并行 (三)非同步/同步任務 & 并行/串列隊列的特點 綜上所述,iOS多線程編程使用GCD的最優原則是能不在阻礙主線程(又叫作UI線程)的情況下,開啟新的線程(子線程)去處理耗時的操作,以便有效提高程序的執行效率和資源利用率,但是同時開啟多個子線程也會引發許多其他的問題,如資源競爭、死鎖、內存損耗等,所以要注意,這篇文章只是介紹GCD的使用,因此可能產生的問題我將會在這個系列後續篇章做介紹。 GCD併發編程產生的作用歸納(考慮線程安全,不死鎖的情況下效果):能開啟新的線程(子線程)多個任務可以同時進行不會阻塞主線程(又叫作UI線程)影響UI事件 三、GCD如何使用 開發者要做的只是定義想執行的任務並追加到適當的隊列(Dispatch Queue)中 1、創建隊列(Dispatch Queue) 第一種:通過GCD的API的dispatch_queue_create函數生成Dispatch Queue 另外需要注意的點是:雖然有ARC編譯器自動管理內存這一優秀技術,但生成的Dispatch Queue必須由程序員主動釋放。 第二種:直接使用系統提供的標準Dispatch Queue :Main Dispatch Queue和Global Dispatch Queue (1)Main Dispatch Queue:主線程中執行的Dispatch Queue,也就是Serial Dispatch Queue(串列隊列),可以通過dispatch_get_main_queue來獲取。 (2) Global Dispatch Queue: 全局併發隊列(Concurrent Dispatch Queue),GCD默認提供了全局的併發隊列,可以通過dispatch_get_global_queue獲取。 2、創建任務 四、隊列任務組合 根據(二)中描述,GCD由隊列和任務兩部分組成,隊列分為串列隊列、并行隊列、主隊列,任務可分為同步和非同步任務,這樣可將隊列與任務組合如下: 1、并行隊列 & 非同步執行 列印結果: 結論: (1) 開啟了新線程 (2) 任務之間不需要排隊,且具有同時被執行的權利 2、并行隊列 & 同步執行 列印結果: 結論: (1) 不開啟了新線程 (2) 任務之間需要排隊,按照追加順序執行 3、串列隊列 & 非同步執行 (1) 開啟了新線程 (2) 任務之間需要排隊,按照追加順序執行 4、串列隊列 & 同步執行 列印結果:結論: (1) 不開啟了新線程 5、主隊列 & 非同步執行列印結果: 結論: (1) 不開啟了新線程 (2) 任務之間需要排隊,按照追加順序執行 6、主隊列 & 同步執行 列印結果:結論:發生死鎖,程序崩潰。 好了GCD系列的上篇就寫到這裡,我將在後續系列中詳細介紹GCD的隊列系列和用法,以及使用GCD可能造成的問題及解決方案,水平有限,有不對的地方還望批評指正!

本文由yidianzixun提供 原文連結

寫了 5860316篇文章,獲得 23313次喜歡
精彩推薦