iOS GCD的使用

什么是GCD
了解GCD前往堡,需要了解的基礎(chǔ)知識(shí)
GCD的使用
使用注意事項(xiàng)

-GCD學(xué)習(xí)前鋪墊-
什么是GCD
GCD (Grand Central Dispatch) 是Apple公司開(kāi)發(fā)的一種技術(shù),它旨在優(yōu)化多核環(huán)境中的并發(fā)操作并取代傳統(tǒng)多線程的編程模式
GCD是基于C語(yǔ)言的線程管理方案按摘,使用者無(wú)需過(guò)多參與線程的管理枚驻,只需要將想要執(zhí)行的代碼濒旦,添加到想要添加的調(diào)度隊(duì)列即可
在Mac OS X 10.6雪豹中首次推出,并在iOS4.0中引入到了iOS
GCD主要用在后臺(tái)執(zhí)行較慢任務(wù)再登;延遲執(zhí)行任務(wù)尔邓;以及在后臺(tái)任務(wù)中,切換回主線程锉矢,更新UI

iOS中常用的其它多線程技術(shù)
pthread:通用于Unix/Linux/Windows的C語(yǔ)言線程管理API梯嗽,可移植性強(qiáng),但是使用繁瑣沽损,需要使用者管理線程生命周期
NSThread:使用Objective-C實(shí)現(xiàn)灯节,輕量級(jí)的線程管理,但是也需要手動(dòng)管理線程的生命周期
NSOperation:基于GCD绵估,使用Objective-C實(shí)現(xiàn)的面向?qū)ο蟮木€程管理炎疆,比GCD更高級(jí),但是處理簡(jiǎn)單任務(wù)會(huì)比GCD代碼更多
總之国裳,iOS里GCD用的很多

GCD知識(shí)鋪墊
競(jìng)爭(zhēng)&同步:兩個(gè)線程搶奪同一個(gè)資源形入,就會(huì)競(jìng)爭(zhēng),為了防止競(jìng)爭(zhēng)缝左,一個(gè)線程擁有資源的時(shí)候亿遂,會(huì)對(duì)資源加鎖螟蒸,另一個(gè)線程就要等待解鎖以后再擁有這個(gè)資源,這叫同步崩掘。
死鎖:兩個(gè)線程互相等待對(duì)方釋放資源
主線程&后臺(tái)線程:主線程也叫前臺(tái)線程七嫌,程序啟動(dòng)的默認(rèn)線程,操作UI的線程苞慢。后臺(tái)線程诵原,即非主線程,用于不影響主線程的完成一些任務(wù)
并行&串行:并行挽放,就是幾個(gè)任務(wù)一起完成绍赛。串行,就是幾個(gè)任務(wù)一個(gè)接著一個(gè)完成辑畦。
同步&異步:同步執(zhí)行線程吗蚌,等待新線程執(zhí)行完以后,再繼續(xù)執(zhí)行當(dāng)前線程纯出,很少用到蚯妇。異步執(zhí)行線程,在執(zhí)行新線程的同時(shí)暂筝,繼續(xù)執(zhí)行當(dāng)前線程箩言,常用。
-GCD的使用-
GCD的使用步驟
創(chuàng)建線程隊(duì)列:主隊(duì)列焕襟,全局并行隊(duì)列陨收,手動(dòng)創(chuàng)建串行隊(duì)列
選擇執(zhí)行方式:同步(較少使用),異步鸵赖,延時(shí)
添加需要執(zhí)行的任務(wù):也就是想要?jiǎng)?chuàng)建隊(duì)列做什么务漩,以Block塊語(yǔ)句形式創(chuàng)建
任務(wù)被執(zhí)行:Block按照設(shè)計(jì)被執(zhí)行

舉例

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"我在五秒后打印"); }); NSLog(@"線程被部署");

這段代碼的原型如下

void dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);

首先,創(chuàng)建線程隊(duì)列它褪,本例中我們使用主隊(duì)列饵骨,所以直接使用dispatch_get_main_queue()
然后,選擇執(zhí)行方式列赎,本例使用延時(shí)方法dispatch_after
添加需要執(zhí)行的任務(wù)宏悦,我們打印了一下log4.任務(wù)被執(zhí)行:

log

異步執(zhí)行線程
異步后臺(tái)線程
主要用途:執(zhí)行較慢的任務(wù),例如大量計(jì)算包吝,網(wǎng)絡(luò)請(qǐng)求等

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"在異步并行隊(duì)列中執(zhí)行"); }); dispatch_queue_t queue = dispatch_queue_create("com.realank.GCDDemo.myQueue", NULL); dispatch_async(queue, ^{ NSLog(@"在異步串行隊(duì)列中執(zhí)行"); });

上面的代碼饼煞,分別創(chuàng)建了一個(gè)異步后臺(tái)并行線程和一個(gè)自創(chuàng)建的異步后臺(tái)串行線程。
異步主線程
主要用途:用于在后臺(tái)線程的任務(wù)將要完成時(shí)诗越,切換到主線程更新UI
dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"在異步主線程中執(zhí)行"); });

同步執(zhí)行線程
同步后臺(tái)線程
主要用途:在新線程中執(zhí)行任務(wù)砖瞧,并且等待線程執(zhí)行完畢再向后執(zhí)行,幾乎不用

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"在同步并行隊(duì)列中執(zhí)行"); }); dispatch_queue_t queue = dispatch_queue_create("com.realank.GCDDemo.myQueue", NULL); dispatch_sync(queue, ^{ NSLog(@"在同步串行隊(duì)列中執(zhí)行"); });

上面的代碼嚷狞,分別創(chuàng)建了一個(gè)異步后臺(tái)并行線程和一個(gè)自創(chuàng)建的異步后臺(tái)串行線程块促。
同步主線程(慎用)
主要用途:只有在其它線程中才可能執(zhí)行此方法荣堰,否則會(huì)死鎖

dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@“在同步主線程中執(zhí)行,慎用竭翠,否則會(huì)死鎖”); });

延時(shí)執(zhí)行線程
主要用途:用于等待一段時(shí)間以后再執(zhí)行的任務(wù)

dispatch_queue_t queue = dispatch_get_main_queue();// 也可以使用其它線程// dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// dispatch_queue_t queue = dispatch_queue_create("com.realank.GCDDemo.myQueue2", NULL); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), queue, ^{ NSLog(@"延時(shí)2秒執(zhí)行"); }); NSLog(@"延時(shí)線程已部署");

-GCD的總結(jié)-
創(chuàng)建線程隊(duì)列
主隊(duì)列:

dispatch_queue_t queue = dispatch_get_main_queue();

全局并行隊(duì)列:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

手動(dòng)創(chuàng)建串行隊(duì)列:

dispatch_queue_t queue = dispatch_queue_create("com.realank.GCDDemo.myQueue", NULL);

線程執(zhí)行方式

異步:
void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

同步(慎用):
void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

延時(shí):
```void dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);```

關(guān)于循環(huán)強(qiáng)引用
在block中使用self振坚,或者使用屬性(會(huì)隱含調(diào)用self),會(huì)讓block持有其類實(shí)例斋扰,如果此時(shí)block渡八,又被存儲(chǔ)為類實(shí)例的copy或strong屬性,就會(huì)造成循環(huán)強(qiáng)引用传货。在GCD的block使用中屎鳍,不會(huì)造成類實(shí)例對(duì)block的引用,但是為了以防萬(wàn)一问裕,我習(xí)慣在Block中統(tǒng)一使用weakSelf來(lái)引用屬性或方法逮壁。
__weak __typeof(self) weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ weakSelf.string = @“hello"; });

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市粮宛,隨后出現(xiàn)的幾起案子窥淆,更是在濱河造成了極大的恐慌,老刑警劉巖窟勃,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祖乳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡秉氧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)蜒秤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)汁咏,“玉大人,你說(shuō)我怎么就攤上這事作媚∪撂玻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵纸泡,是天一觀的道長(zhǎng)漂问。 經(jīng)常有香客問(wèn)我,道長(zhǎng)女揭,這世上最難降的妖魔是什么蚤假? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮吧兔,結(jié)果婚禮上磷仰,老公的妹妹穿的比我還像新娘。我一直安慰自己境蔼,他們只是感情好灶平,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布伺通。 她就那樣靜靜地躺著,像睡著了一般逢享。 火紅的嫁衣襯著肌膚如雪罐监。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天瞒爬,我揣著相機(jī)與錄音弓柱,去河邊找鬼。 笑死疮鲫,一個(gè)胖子當(dāng)著我的面吹牛吆你,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俊犯,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妇多,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了燕侠?” 一聲冷哼從身側(cè)響起者祖,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绢彤,沒(méi)想到半個(gè)月后七问,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茫舶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年械巡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饶氏。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讥耗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疹启,到底是詐尸還是另有隱情古程,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布喊崖,位于F島的核電站挣磨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏荤懂。R本人自食惡果不足惜茁裙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望势誊。 院中可真熱鬧呜达,春花似錦、人聲如沸粟耻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至霜威,卻和暖如春谈喳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戈泼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工婿禽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人大猛。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓扭倾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親挽绩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膛壹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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