GCD

一、簡(jiǎn)單介紹

1.什么是GCD?

全稱(chēng)是Grand Central Dispatch,可譯為“牛逼的中樞調(diào)度器”

純C語(yǔ)言,提供了非常多強(qiáng)大的函數(shù)

2.GCD的優(yōu)勢(shì)

GCD是蘋(píng)果公司為多核的并行運(yùn)算提出的解決方案

GCD會(huì)自動(dòng)利用更多的CPU內(nèi)核(比如雙核、四核)

GCD會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)、銷(xiāo)毀線程)

程序員只需要告訴GCD想要執(zhí)行什么任務(wù),不需要編寫(xiě)任何線程管理代碼

3.提示

(1)GCD存在于libdispatch.dylib這個(gè)庫(kù)中,這個(gè)調(diào)度庫(kù)包含了GCD的所有的東西,但任何IOS程序,默認(rèn)就加載了這個(gè)庫(kù),在程序運(yùn)行的過(guò)程中會(huì)動(dòng)態(tài)的加載這個(gè)庫(kù),不需要我們手動(dòng)導(dǎo)入。

點(diǎn)擊+a按鈕,可以導(dǎo)入框架。

(2)GCD是純C語(yǔ)言的,因此我們?cè)诰帉?xiě)GCD相關(guān)代碼的時(shí)候,面對(duì)的函數(shù),而不是方法。

(3)GCD中的函數(shù)大多數(shù)都以dispatch開(kāi)頭。

二、任務(wù)和隊(duì)列

GCD中有2個(gè)核心概念

(1)任務(wù):執(zhí)行什么操作

(2)隊(duì)列:用來(lái)存放任務(wù)

GCD的使用就2個(gè)步驟

(1)定制任務(wù)

(2)確定想做的事情

將任務(wù)添加到隊(duì)列中,GCD會(huì)自動(dòng)將隊(duì)列中的任務(wù)取出,放到對(duì)應(yīng)的線程中執(zhí)行

提示:任務(wù)的取出遵循隊(duì)列的FIFO原則:先進(jìn)先出,后進(jìn)后出

三、執(zhí)行任務(wù)

1.GCD中有2個(gè)用來(lái)執(zhí)行任務(wù)的函數(shù)

說(shuō)明:把右邊的參數(shù)(任務(wù))提交給左邊的參數(shù)(隊(duì)列)進(jìn)行執(zhí)行。

(1)用同步的方式執(zhí)行任務(wù)?dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

參數(shù)說(shuō)明:

queue:隊(duì)列

block:任務(wù)

(2)用異步的方式執(zhí)行任務(wù)?dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

2.同步和異步的區(qū)別

同步:在當(dāng)前線程中執(zhí)行

異步:在另一條線程中執(zhí)行

四、隊(duì)列

1.隊(duì)列的類(lèi)型

GCD的隊(duì)列可以分為2大類(lèi)型

(1)并發(fā)隊(duì)列(Concurrent Dispatch Queue)

可以讓多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行(自動(dòng)開(kāi)啟多個(gè)線程同時(shí)執(zhí)行任務(wù))并發(fā)功能只有在異步(dispatch_async)函數(shù)下才有效

(2)串行隊(duì)列(Serial Dispatch Queue)

讓任務(wù)一個(gè)接著一個(gè)地執(zhí)行(一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù))

2.補(bǔ)充說(shuō)明

有4個(gè)術(shù)語(yǔ)比較容易混淆:同步、異步、并發(fā)、串行

同步和異步?jīng)Q定了要不要開(kāi)啟新的線程

同步:在當(dāng)前線程中執(zhí)行任務(wù),不具備開(kāi)啟新線程的能力

異步:在新的線程中執(zhí)行任務(wù),具備開(kāi)啟新線程的能力

并發(fā)和串行決定了任務(wù)的執(zhí)行方式

并發(fā):多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行

串行:一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù)

3.串行隊(duì)列

GCD中獲得串行有2種途徑

(1)使用dispatch_queue_create函數(shù)創(chuàng)建串行隊(duì)列

dispatch_queue_t ?dispatch_queue_create(const char *label, ?dispatch_queue_attr_t attr); //?隊(duì)列名稱(chēng), 隊(duì)列屬性,一般用NULL即可

示例:

dispatch_queue_t queue = dispatch_queue_create("wendingding", NULL); // 創(chuàng)建

dispatch_release(queue); // 非ARC需要釋放手動(dòng)創(chuàng)建的隊(duì)列

(2)使用主隊(duì)列(跟主線程相關(guān)聯(lián)的隊(duì)列)

主隊(duì)列是GCD自帶的一種特殊的串行隊(duì)列,放在主隊(duì)列中的任務(wù),都會(huì)放到主線程中執(zhí)行

使用dispatch_get_main_queue()獲得主隊(duì)列

示例:

dispatch_queue_t queue = dispatch_get_main_queue();

4.并發(fā)隊(duì)列

GCD默認(rèn)已經(jīng)提供了全局的并發(fā)隊(duì)列,供整個(gè)應(yīng)用使用,不需要手動(dòng)創(chuàng)建

使用dispatch_get_global_queue函數(shù)獲得全局的并發(fā)隊(duì)列

dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags); // 此參數(shù)暫時(shí)無(wú)用,用0即可

示例:

這個(gè)參數(shù)是留給以后用的,暫時(shí)用不上,傳個(gè)0。

第一個(gè)參數(shù)為優(yōu)先級(jí),這里選擇默認(rèn)的。獲取一個(gè)全局的默認(rèn)優(yōu)先級(jí)的并發(fā)隊(duì)列。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 獲得全局并發(fā)隊(duì)列

說(shuō)明:全局并發(fā)隊(duì)列的優(yōu)先級(jí)

#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高

#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默認(rèn)(中)

#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后臺(tái)

5.各種隊(duì)列的執(zhí)行效果

五、代碼示例

(1)用異步函數(shù)往并發(fā)隊(duì)列中添加任務(wù)

1//2//YYViewController.m3//08-GCD基本使用4//5//Created by apple on 14-6-24.6//Copyright (c) 2014年 itcase. All rights reserved.7//89#import"YYViewController.h"1011@interfaceYYViewController ()1213@end1415@implementationYYViewController1617- (void)viewDidLoad18{19[super viewDidLoad];20//1.獲得全局的并發(fā)隊(duì)列21dispatch_queue_t queue =? dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);22//2.添加任務(wù)到隊(duì)列中,就可以執(zhí)行任務(wù)23//異步函數(shù):具備開(kāi)啟新線程的能力24dispatch_async(queue, ^{25NSLog(@"下載圖片1----%@",[NSThread currentThread]);26});27dispatch_async(queue, ^{28NSLog(@"下載圖片2----%@",[NSThread currentThread]);29});30dispatch_async(queue, ^{31NSLog(@"下載圖片2----%@",[NSThread currentThread]);32});33//打印主線程34NSLog(@"主線程----%@",[NSThread mainThread]);3536}3738@end

總結(jié):同時(shí)開(kāi)啟三個(gè)子線程

(2)用異步函數(shù)往串行隊(duì)列中添加任務(wù)

1//2//YYViewController.m3//09—GCD基本使用24//5//Created by apple on 14-6-24.6//Copyright (c) 2014年 itcase. All rights reserved.7//89#import"YYViewController.h"1011@interfaceYYViewController ()1213@end1415@implementationYYViewController1617- (void)viewDidLoad18{19[super viewDidLoad];2021//打印主線程22NSLog(@"主線程----%@",[NSThread mainThread]);2324//創(chuàng)建串行隊(duì)列25dispatch_queue_t? queue= dispatch_queue_create("wendingding", NULL);26//第一個(gè)參數(shù)為串行隊(duì)列的名稱(chēng),是c語(yǔ)言的字符串27//第二個(gè)參數(shù)為隊(duì)列的屬性,一般來(lái)說(shuō)串行隊(duì)列不需要賦值任何屬性,所以通常傳空值(NULL)2829//2.添加任務(wù)到隊(duì)列中執(zhí)行30dispatch_async(queue, ^{31NSLog(@"下載圖片1----%@",[NSThread currentThread]);32});33dispatch_async(queue, ^{34NSLog(@"下載圖片2----%@",[NSThread currentThread]);35});36dispatch_async(queue, ^{37NSLog(@"下載圖片2----%@",[NSThread currentThread]);38});3940//3.釋放資源41//dispatch_release(queue);42}4344@end

總結(jié):會(huì)開(kāi)啟線程,但是只開(kāi)啟一個(gè)線程

(3)用同步函數(shù)往并發(fā)隊(duì)列中添加任務(wù)

1//2//YYViewController.m3//10-CGD基本使用34//5//Created by apple on 14-6-24.6//Copyright (c) 2014年 itcase. All rights reserved.7//89#import"YYViewController.h"1011@interfaceYYViewController ()1213@end1415@implementationYYViewController16/**17*? 用同步函數(shù)往并發(fā)隊(duì)列中添加任務(wù)18*/19- (void)viewDidLoad20{21[super viewDidLoad];2223//打印主線程24NSLog(@"主線程----%@",[NSThread mainThread]);2526//創(chuàng)建串行隊(duì)列27dispatch_queue_t? queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);282930//2.添加任務(wù)到隊(duì)列中執(zhí)行31dispatch_sync(queue, ^{32NSLog(@"下載圖片1----%@",[NSThread currentThread]);33});34dispatch_sync(queue, ^{35NSLog(@"下載圖片2----%@",[NSThread currentThread]);36});37dispatch_sync(queue, ^{38NSLog(@"下載圖片3----%@",[NSThread currentThread]);39});40}4142@end

總結(jié):不會(huì)開(kāi)啟新的線程,并發(fā)隊(duì)列失去了并發(fā)的功能

(4)用同步函數(shù)往串行隊(duì)列中添加任務(wù)

1//2//YYViewController.m3//11—CGD基本使用44//5//Created by apple on 14-6-24.6//Copyright (c) 2014年 itcase. All rights reserved.7//89#import"YYViewController.h"1011@interfaceYYViewController ()1213@end1415@implementationYYViewController161718/**19*用同步函數(shù)往串行隊(duì)列中添加任務(wù)20*/21- (void)viewDidLoad22{23[super viewDidLoad];24NSLog(@"用同步函數(shù)往串行隊(duì)列中添加任務(wù)");25//打印主線程26NSLog(@"主線程----%@",[NSThread mainThread]);2728//創(chuàng)建串行隊(duì)列29dispatch_queue_t? queue= dispatch_queue_create("wendingding", NULL);3031//2.添加任務(wù)到隊(duì)列中執(zhí)行32dispatch_sync(queue, ^{33NSLog(@"下載圖片1----%@",[NSThread currentThread]);34});35dispatch_sync(queue, ^{36NSLog(@"下載圖片2----%@",[NSThread currentThread]);37});38dispatch_sync(queue, ^{39NSLog(@"下載圖片3----%@",[NSThread currentThread]);40});41}4243@end

總結(jié):不會(huì)開(kāi)啟新的線程

(5)補(bǔ)充

補(bǔ)充:隊(duì)列名稱(chēng)的作用:

將來(lái)調(diào)試的時(shí)候,可以看得出任務(wù)是在哪個(gè)隊(duì)列中執(zhí)行的。

(6)小結(jié)

說(shuō)明:同步函數(shù)不具備開(kāi)啟線程的能力,無(wú)論是什么隊(duì)列都不會(huì)開(kāi)啟線程;異步函數(shù)具備開(kāi)啟線程的能力,開(kāi)啟幾條線程由隊(duì)列決定(串行隊(duì)列只會(huì)開(kāi)啟一條新的線程,并發(fā)隊(duì)列會(huì)開(kāi)啟多條線程)。

同步函數(shù)

(1)并發(fā)隊(duì)列:不會(huì)開(kāi)線程

(2)串行隊(duì)列:不會(huì)開(kāi)線程

異步函數(shù)

(1)并發(fā)隊(duì)列:能開(kāi)啟N條線程

(2)串行隊(duì)列:開(kāi)啟1條線程

補(bǔ)充:

凡是函數(shù)中,各種函數(shù)名中帶有create\copy\new\retain等字眼,都需要在不需要使用這個(gè)數(shù)據(jù)的時(shí)候進(jìn)行release。

GCD的數(shù)據(jù)類(lèi)型在ARC的環(huán)境下不需要再做release。

CF(core Foundation)的數(shù)據(jù)類(lèi)型在ARC環(huán)境下還是需要做release。

異步函數(shù)具備開(kāi)線程的能力,但不一定會(huì)開(kāi)線程

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

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

  • 3.GCD GCD的全稱(chēng)是Grand Central Dispatch,提供了非常多的純C語(yǔ)言的函數(shù) GCD的優(yōu)勢(shì)...
    Mario_ZJ閱讀 508評(píng)論 0 0
  • 1. GCD簡(jiǎn)介 什么是GCD呢?我們先來(lái)看看百度百科的解釋簡(jiǎn)單了解下概念 引自百度百科:Grand Centra...
    千尋_544f閱讀 401評(píng)論 0 0
  • #import "ViewController.h" @interface ViewController () @...
    艾克12138閱讀 225評(píng)論 0 0
  • 第一次組會(huì),我選擇的記錄大臣的職位。由于利君無(wú)法錄音,我安排她做了主持。在線上天使班的時(shí)候,我只是主持過(guò)...
    yolanda的花花世界閱讀 477評(píng)論 0 5
  • 喝了這杯咖啡 今天晚上是不打算睡了 閉館之后去學(xué)院吧 希望空調(diào)房沒(méi)有鎖門(mén) 特別想眼前的事情都可以完美得解決 特別想...
    從未荼靡閱讀 167評(píng)論 0 0