iOS多線程之4.GCD簡介

来源:http://www.cnblogs.com/doujiangyoutiao/archive/2016/11/04/6030150.html
-Advertisement-
Play Games

GCD(Grand Central Dispatch)應該是我們開發中最常用到的多線程解決方案,是蘋果公司專門為多核的並行運算提出的解決方案,是基於C語言的,提供了很多非常強大的函數。 GCD的優勢 1.會自動利用更多的CPU內核(從iPhone4s開始是雙核,iPhone7系列是4核)。 2.會自 ...


GCD(Grand Central Dispatch)應該是我們開發中最常用到的多線程解決方案,是蘋果公司專門為多核的並行運算提出的解決方案,是基於C語言的,提供了很多非常強大的函數。

GCD的優勢

1.會自動利用更多的CPU內核(從iPhone4s開始是雙核,iPhone7系列是4核)。
2.會自動管理線程的創建、生命周期、銷毀等,不需要寫一句關於線程的代碼。
3.將任務添加到隊列中,GCD會自動從隊列中將任務取出,放到對應的線程中執行。

進程與線程

1.簡單點說一個APP就是一個進程,例如微信、迅雷都分別是一個進程。
2.一個進程可以擁有多條線程。當我們打開APP時系統會自動幫我們創建一條主線程,當我們要讓APP乾點別的事時,例如刷新數據,就要開啟一條子線程來向伺服器請求數據,所以一個進程可以擁有多條線程。(並不是讓APP乾什麼事,都會開啟子線程,這裡只是為瞭解釋方便,才這麼說的。)
20161029092719352.png

隊列(queue)

  隊列就是用來存放任務的,任務就是我們讓APP乾的事,例如下載圖片,刷新數據等,都是任務。我們使用GCD,只要把任務放到隊列中就可以了,系統會自動幫我們創建線程,調度任務。任務的調度原則遵行FIFO原則,就是哪個任務先放進隊列中,就先執行。隊列分為串列隊列,和並行(併發)隊列。
1.串列隊列 : 就是隊列里的任務必須一個一個往下執行。例如我們要執行A、B、C 三個任務,我們把這三個任務放到串列隊列中,必須是A執行完,B才執行,B執行完C才執行。
創建串列隊列有兩種方法:
(1)自定義隊列
代碼:

 // 創建串列隊列
    dispatch_queue_t queue = dispatch_queue_create("doujiangyoutiao", DISPATCH_QUEUE_SERIAL);
    // 添加任務A
    dispatch_async(queue, ^{
        NSLog(@"執行任務A");
    });
    // 添加任務B
    dispatch_async(queue, ^{
        NSLog(@"執行任務B");
    });
    // 添加任務C
    dispatch_async(queue, ^{
        NSLog(@"執行任務C");
    });

日誌

2016-11-04 14:00:06.546 TTTTTTTTTT[11059:128030] 執行任務A
2016-11-04 14:00:06.546 TTTTTTTTTT[11059:128030] 執行任務B
2016-11-04 14:00:06.547 TTTTTTTTTT[11059:128030] 執行任務C

1)“doujiangyoutiao”是這個隊列的名字;
2)DISPATCH_QUEUE_SERIAL表示創建的是一條串列對列。
(2)主隊列
dispatch_queue_t queue =dispatch_get_main_queue();
得到主隊列,主隊列是串列隊列,主隊列中的任務預設都在主線程中執行。
2.並行隊列:就是隊列里的任務可以一齊執行。還是舉執行A、B、C 三個任務的例子。我們把三個任務放到並行隊列中,這三個任務可以一起執行,所以不一定誰先下載完。串列隊列里一定是A先下載完。
代碼:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 創建並行隊列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 添加任務A
    dispatch_async(queue, ^{
        NSLog(@"執行任務A");
    });
    // 添加任務B
    dispatch_async(queue, ^{
        NSLog(@"執行任務B");
    });
    // 添加任務C
    dispatch_async(queue, ^{
        NSLog(@"執行任務C");
    });
}

每次列印的日誌應該都不一樣,有興趣可以多試幾次。

2016-11-04 14:09:03.871 TTTTTTTTTT[11356:131391] 執行任務B
2016-11-04 14:09:03.871 TTTTTTTTTT[11356:131393] 執行任務C
2016-11-04 14:09:03.871 TTTTTTTTTT[11356:131390] 執行任務A

創建並行隊列有兩種方法:
(1)看上面代碼得到全局並行隊列,不需要我們創建,我們一般用這個。第一個參數表示這個隊列的優先順序
(DISPATCH_QUEUE_PRIORITY_HIGH、DISPATCH_QUEUE_PRIORITY_DEFAULT、DISPATCH_QUEUE_PRIORITY_LOW、DISPATCH_QUEUE_PRIORITY_BACKGROUND),用第二個就可以。第二個參數還沒開發出來,沒有用,預設寫0即可。
(2)自定義隊列
dispatch_queue_t queue=dispatch_queue_create("fuhang",DISPATCH_QUEUE_CONCURRENT);
"fuhang"為併發隊列的名字,後面表示創建的隊列為並行隊列。

註意:

  1. 併發隊列里的任務一定會一起執行嘛?
    答:肯定不會啊。如果併發隊列里有100個任務,一起執行就得創建100條線程,那不得累死CPU啊!任務少了會一起執行,任務多了對先一起執行一部分。
  2. 線程併發???
    答:錯。串列併發是形容隊列的!!!線程沒有,線程里的任務都是一個一個的往下執行,不可能多個任務一起執行。

同步和非同步

  同步:會堵塞當前線程,隊列里的任務執行完,任務所在的線程才會往下執行。其實說白了就是插隊。
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
第一個參數是隊列,第二個參數是要往隊列里添加的任務。

20161029093326640.png
  非同步:不會堵塞當前線程。
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
同上。
  同步和非同步就是用來判斷是否要在當前線程的基礎上創建新的線程。同步不會創建新的線程,隊列里的任務在當前線程中執行,所以會堵塞當前線程。但是非同步也不是一定會創建新的線程,這要根據CPU的使用情況來看,但是大多數情況會創建一個線程。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (以下圖片在IE瀏覽器中可能無法顯示) 在開始筆記之前先加點之前記下的小知識點: UIView的常見屬性和方法: 1.@property(nonatomic,radonly)UIView *superview; 獲得自己的父控制項對象 2.@property (nonatomic,radonly,co ...
  • 動畫效果可以大大提高界面的交互效果,因此,動畫在移動開發中的應用場景較為普遍。掌握基本的動畫效果在成熟的軟體開發中不可或缺。除此之外,用戶對於動畫的接受程度遠高於文字和圖片,利用動畫效果可以加深用戶對於產品的印象。因此本文給出安卓設計中幾種常見的動畫效果。 基礎知識 在介紹安卓中的動畫效果之前,有必 ...
  • 1、簡介 Fresco是Facebook最新推出的一款用於Android應用中展示圖片的強大圖片庫,可以從網路、本地存儲和本地資源中載入圖片。相對於ImageLoader,擁有更快的圖片下載速度以及可以載入和顯示gif圖等諸多優勢,是個很好的圖片框架。 2、特點 1)記憶體管理 在5.0以下系統,Fr ...
  • 本篇記錄星級評分組件的創建過程以及CALayer的運用。 為了實現一個星級評分的組件,使用了CALayer,涉及到mask、CGPathRef、UIBezierPath、動畫和一個計算多角星關鍵節點的演算法。 CALayer管理基於圖像的內容,並讓我們可以在內容上添加動畫。UIView及其子類擁有一個 ...
  • 今天看Mansonry的代碼時,碰到一個生僻的關鍵字(也許只是自己沒用過)。:-) @encode => 將給定類型編碼為內部表示的字元串。 為了方便自己查閱,順便也寫個小例子,貼在這裡,實踐出真知嘛。 NSLog(@"UIViewController : %s", @encode(UIViewCo ...
  • 前言:之前做了公司閱讀類的App,最近有時間來寫一下閱讀部分的實現過程,供梳理邏輯,計劃會寫一個系列希望能涉及到儘量多的方面與細節,歡迎大家交流、吐槽、拍磚,共同進步。 閱讀的排版用的是coretext,這篇介紹用coretext實現基本的排版功能。 關於coretext的實現原理,可以查看文檔或其 ...
  • 二. Xcode基本快捷鍵 新建項目 Shift + CMD + N 項目中新建文件 CMD + N 運行 CMD + R 編譯 CMD + B 停止運行 CMD + . 清除緩存 Shift + CMD + K 左縮進 CMD + [ 右縮進 CMD + ] 關閉項目 CMD + W 終止程式 C ...
  • 用SDWebImage漸變載入圖片 使用 使用請詳細查看源碼,只需要給定一個圖片地址以及一個placeHolder圖片(非必須)即可。 效果 源碼 https://github.com/YouXianMing/UI-Component-Collection 中的 SDWebImageViewPlac ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...