標籤:style blog c http width get
並發所描述的概念就是同時運行多個任務。這些任務可能是以在單核 CPU 上分時(時間分享)的形式同時運行,也可能是在多核 CPU 上以真正的並行方式來運行。這篇文章是作者在學習iOS開發技術當中,遇到多線程問題時捋順思路時的一些看法。
GCD是iOS開發當中解決多核開發的一個技術。
主要有三種隊列:一、運行在主線程的 Main queque 通過dispatch_get_main_queque 來擷取
二、並行隊列 global dispatch queque ,通過dispatch_get_global_queque 擷取。並行隊列的優先順序 有 high ,default , low。
三、串列隊列 serial queues一般用於按順序同步訪問,可建立任意數量的串列隊列,各個串列隊列之間是並發的。當想要任務按照某一個特定 的順序執行時,串列隊列是很有用的。串列隊列在同一個時間只執行一個任務。我們可以使用串列隊列代替鎖去保護共用的資料。和鎖不 同,一個串列隊列可以保證任務在一個可預知的順序下執行。
serial queues通過dispatch_queue_create建立,可以使用函數dispatch_retain和dispatch_release去增加或者減少引用計數。
一:問題描述: 取一段字串,將其全部轉換成大寫 ,然後計算該字串的長度以及替換部分字元。Demo的目的是:求得多線程技術能減少具體的已耗用時間是多少,展現正確使用多線程技術能極大提高代碼執行效率。
二:問題分析: 首先要擷取一段字串,這個任務應該是最先完成的。將該字串全部轉換成大寫,計算長度,替換相關位置 三個動作是互不相關的 。因此前後兩者有循序關聯性 應做成串列隊列 ,三個動作分成並行隊列。
三:測試結果對比:
圖1 (使用GCD技術)
圖2(未使用GCD)
首先將兩種不同方法(多線程與非多線程)所花費的時間進行比較 :圖1使用GCD技術實現Demo花費時間 : 圖2使用非GCD技術實現Demo花費時間 = 1:10 。
由此一小段代碼前後已耗用時間的恐怖差別,對多線程提高代碼執行效率可見一斑。
圖3(GCD)
注意:1,block塊變數的範圍範圍
2,分組的三個動作 處理的對象都是fetchData ,這一點必須把握清楚。並行隊列裡是隨機執行的,因此將三個動作(轉換大寫,計算長度,替換字元)放在同一組當中,不見得先執行第一個 ,
在測試Demo的時候,因為是先寫的非GCD情況 當重構代碼的時候 ,我並沒有將兩個(計算長度 替換字元)方法處理的對象從handleData(轉換大寫)改fetchData(資料),也就說並沒有完全理解 並列隊列的執行順序 以為也會是順序執行 三個同一層級的有兩個是依賴第一個的處理結果 ,出現了邏輯上的錯誤。
3,整個頁面的重新整理顯示 ,應該是放在主線程中進行。
圖4(非GCD)
註: 基本的順序執行。
//以上內容有參照 http://objccn.io/issue-2-1/