GCD多線程澄峰,任務(wù)嫉沽,進(jìn)程,同步俏竞,異步

GCD -Grand Central Dispatch

GCD包含于libdispatch.dylib绸硕,系統(tǒng)默認(rèn)加載這個(gè)庫

GCD 是純C語言的,函數(shù)大多以dispatch開頭魂毁。

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

任務(wù)

既是要執(zhí)行什么任務(wù)玻佩。

隊(duì)列

既是存放任務(wù)的。

定制任務(wù)

確定想做的事情

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

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

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

GCD中有2個(gè)用來執(zhí)行任務(wù)的函數(shù):

同步方式:dispatch_sync(dispatch_quene_t queue,dispatch_block_t block)

異步方式:dispatch_async(dispatch_queue_t queue,dispatch_block_t block)

把block中的任務(wù)提交給queue隊(duì)列來執(zhí)行

同步(dispatch_sync)和異步(dispatch_async)的區(qū)別

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

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

隊(duì)列

隊(duì)列的類型

GCD的隊(duì)列可以分為2大類型:并發(fā)隊(duì)列(Concurrent Dispatch Queue)和串行隊(duì)列(Serial Dispatch Queue)

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

可以讓多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行(自動(dòng)開啟多個(gè)線程同時(shí)執(zhí)行任務(wù))烦秩,并發(fā)功能只有在異步函數(shù)(dispatch_async(dispatch_queue_t queue_t,dispatch_block_t block))中才有效刁赦。

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

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

Tips:容易混淆的幾個(gè)概念-同步闻镶、異步、并發(fā)丸升、串行

同步和異步?jīng)Q定要不要開啟新的線程

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

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

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

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

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

串行隊(duì)列

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

函數(shù)原型:

dispatch_queue_t dispatch_queue_create(const char *label,dispatch_queue_attr_t attr)

label:隊(duì)列名稱-C語言的字符串墩剖、attr:隊(duì)列屬性-一般用NULL即可

示例:dispatch_queue_t queue = dispatch_queue_create("com.jiakaotuan.Gcd",NULL);

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

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

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

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

函數(shù)原型:

dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags)

priority:隊(duì)列優(yōu)先級(jí)岭皂,flags:保留的參數(shù)-傳0即可郊霎。

priority代表全局隊(duì)列的優(yōu)先級(jí),有以下幾個(gè)選項(xiàng)

全局并發(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)

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

全局并發(fā)隊(duì)列手動(dòng)創(chuàng)建串行隊(duì)列主隊(duì)列

同步(sync)沒有開啟新線程,串行執(zhí)行隊(duì)列沒有開啟新線程爷绘,串行執(zhí)行任務(wù)沒有開啟新線程书劝,串行執(zhí)行任務(wù)

異步(async)有開啟新線程,并發(fā)執(zhí)行任務(wù)有開啟新線程串行執(zhí)行任務(wù)沒有開啟新線程土至,串行執(zhí)行任務(wù)

GCD

1.dispatch_async

1.為了避免界面在處理耗時(shí)的操作時(shí)卡死购对,比如讀取網(wǎng)絡(luò)數(shù)據(jù),IO陶因,數(shù)據(jù)庫讀寫等骡苞,我們會(huì)在另外一個(gè)線程中處理這些耗時(shí)的操作,處理完成之后在主線程更新UI界面楷扬。(記住UI的更新只能在主線程哦)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY,0)),^{

NSURL *url = [NSURL URLWithString:@"http://c.hiphotos.baidu.com/image/h%3D200/sign=a7b8619c4e540923b569647ea259d1dc/50da81cb39dbb6fd786f7a990e24ab18972b375c.jpg"];

NSData *data = [[NSData alloc]initWithContentsOfURL:url];

UIImage *image = [[UIImage alloc]initWithData:data];

if(data != nil && image != nil){

dispatch_async(dispatch_get_main_queue(),^{

self.imageView.image = image;

}

}

}

2.獲取global_queue

dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

3.獲取main_queue

dispatch_queue_t mainQueue = dispatch_get_main_queue();

2.dispatch_group_async

dispatch_group_async可以監(jiān)聽一組任務(wù)是否完成解幽,完成后得到通知執(zhí)行其他的操作。比如你進(jìn)行了2個(gè)下載任務(wù)烘苹,當(dāng)這2個(gè)下載任務(wù)都完成后你通知界面刷新UI躲株。

dispatch_queue_t queue =? ? dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group,queue,^{

[NSThread sleepForTimeInterval:1];

NSLog(@"one");

}

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group,queue,^{

[NSThread sleepForTimeInterval:2];

NSLog(@"two");

}

dispatch_group_notify(group,dispatch_get_main_queue(),^{

NSLog(@"updateUI");

}

dispatch_release(group);

diapatch_group_async是異步的方法,運(yùn)行結(jié)果如下

one

two

updateUI

可以看到在打印完one和two之后再打印的updateUI

3.dispatch_barrier_async

dispatch_barrier_async是在前面的任務(wù)執(zhí)行完畢之后才開始執(zhí)行的,同理要等它執(zhí)行完畢之后螟加,它后面的任務(wù)才會(huì)開始執(zhí)行徘溢。

dispatch_queue_t queue = dispatch_queue_create("gcdDemo",DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue,^{

[NSThread sleepForTimeInterval:2];

NSLog(@"dispatch_async_after_2s");

})

dispatch_async(queue,^{

[NSThread sleepForTimeInterval:4];

NSLog(@"dispatch_async_after_4s");

})

dispatch_barrier_async(queue,^{

NSLog(@"dispatch_barrier_async");

[NSThread sleepForTimeInterval:4];

})

dispatch_async(queue,^{

[NSThread sleepForTimeInterval:1];

NSLog(@"dispatch_async_after_1s");

})

注意看打印的時(shí)間:

打印時(shí)間打印內(nèi)容說明

16:20:33.900dispatch_async_after_2s在33s的時(shí)候打印的

16:20:35.900dispatch_async_after_4s在35s的時(shí)候打印的,和上一個(gè)打印相差2s=(4s-2s)

16:20:35.900dispatch_barrier_async在35s的時(shí)候打印的捆探,是在上一個(gè)結(jié)束之后打印的

16:20:40.900dispatch_async_after_1s在40s的時(shí)候打印的然爆,在上一個(gè)打印結(jié)束之后,睡了4s后又睡了1s才打印的黍图,所以和上一個(gè)打印相差5s=(4s+1s)

4.dispatch_apply

執(zhí)行某個(gè)代碼片段N次

dispatch_apply(N,globalQ,^(size_t index){

//執(zhí)行N次

});

文/志城(簡書作者)

原文鏈接:http://www.reibang.com/p/7ae752507800

著作權(quán)歸作者所有曾雕,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”助被。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剖张,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子揩环,更是在濱河造成了極大的恐慌搔弄,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丰滑,死亡現(xiàn)場離奇詭異顾犹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門炫刷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來擎宝,“玉大人,你說我怎么就攤上這事浑玛∩苌辏” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵顾彰,是天一觀的道長极阅。 經(jīng)常有香客問我,道長拘央,這世上最難降的妖魔是什么涂屁? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮灰伟,結(jié)果婚禮上拆又,老公的妹妹穿的比我還像新娘。我一直安慰自己栏账,他們只是感情好帖族,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挡爵,像睡著了一般竖般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茶鹃,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天涣雕,我揣著相機(jī)與錄音,去河邊找鬼闭翩。 笑死挣郭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疗韵。 我是一名探鬼主播兑障,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蕉汪!你這毒婦竟也來了流译?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對情侶失蹤者疤,失蹤者是張志新(化名)和其女友劉穎福澡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驹马,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竞漾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年眯搭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片业岁。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖寇蚊,靈堂內(nèi)的尸體忽然破棺而出笔时,到底是詐尸還是另有隱情,我是刑警寧澤仗岸,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布允耿,位于F島的核電站,受9級(jí)特大地震影響扒怖,放射性物質(zhì)發(fā)生泄漏较锡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一盗痒、第九天 我趴在偏房一處隱蔽的房頂上張望蚂蕴。 院中可真熱鬧,春花似錦俯邓、人聲如沸骡楼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸟整。三九已至,卻和暖如春朦蕴,著一層夾襖步出監(jiān)牢的瞬間篮条,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工吩抓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涉茧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓琴拧,卻偏偏與公主長得像降瞳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蚓胸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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