iOS中 GCD-Grand Central Dispath 多線(xiàn)程 ??

版權(quán)聲明:本文為博主原創(chuàng)文章车伞,未經(jīng)博主允許不得轉(zhuǎn)載。

GCD:Grand Central Dispath "牛逼的中樞調(diào)度器";是純C語(yǔ)言編寫(xiě)的,提供了很多比較強(qiáng)大的函數(shù).

GCD:優(yōu)勢(shì)

1.目前是蘋(píng)果主推的線(xiàn)程管理方式
2.它會(huì)自動(dòng)的利用更多的CPU資源(雙核,四核)
3.它會(huì)自動(dòng)的管理線(xiàn)程的生命周期(線(xiàn)程的創(chuàng)建/調(diào)度/銷(xiāo)毀);
4.程序員只需要告訴GCD自己想要執(zhí)行的哪些任務(wù),不需要寫(xiě)一行線(xiàn)程管理的代碼

#import "ViewController.h"

#define kURLString1 @"http://www.nbsheji.cn/uploadfiles/2010113143922418.jpg"

#define kURLString2 @"http://amuse.nen.com.cn/imagelist/11/21/9as70n3ir61b.jpg"

@interface ViewController ()

@property (retain, nonatomic) IBOutlet UIImageView *FirstView;//第一個(gè)圖片

@property (retain, nonatomic) IBOutlet UIImageView *secondView;//第二個(gè)圖片

@property(nonatomic,retain)NSMutableArray *dataSource;//存儲(chǔ)請(qǐng)求下來(lái)的數(shù)據(jù)

@end

@implementation ViewController

//懶加載

- (NSMutableArray *)dataSource
{
  if (_dataSource == nil) 
  {
    self.dataSource = [NSMutableArray arrayWithCapacity:0];
  }
return [[_dataSource retain]autorelease];
}```

1.串行隊(duì)列:(線(xiàn)程同步)添加到這個(gè)隊(duì)列的任務(wù)一個(gè)接一個(gè)的執(zhí)行(一個(gè)任務(wù)完成,才再去完成另一個(gè)任務(wù))

  • (IBAction)handleSerialQueue:(UIButton *)sender
    {
    //獲取系統(tǒng)串行隊(duì)列

// (1)向系統(tǒng)的創(chuàng)建的串行隊(duì)列中添加異步任務(wù),還是在主線(xiàn)程中完成;

// (2)向系統(tǒng)創(chuàng)建的串行隊(duì)列中添加同步任務(wù),會(huì)造成線(xiàn)程死鎖,導(dǎo)致其他人無(wú)法執(zhí)行;

dispatch_queue_t queue1 = dispatch_get_main_queue();

//01:隊(duì)列的唯一標(biāo)識(shí),采用反域名形式

//02:隊(duì)列的屬性類(lèi)型,也就是標(biāo)識(shí)這個(gè)隊(duì)列是串行隊(duì)列還是并行隊(duì)列

// (1)自己創(chuàng)建的串行隊(duì)列中添加異步任務(wù)是在子線(xiàn)程中完成任務(wù);

// (2)自己創(chuàng)建的串行隊(duì)列中添加同步任務(wù)是在主線(xiàn)程中完成任務(wù);

dispatch_queue_t queue2 = dispatch_queue_create("com.xcqnzf.xuchang", DISPATCH_QUEUE_SERIAL);

/*

//異步任務(wù)

//第一個(gè)參數(shù):任務(wù)添加到隊(duì)列名稱(chēng)

//第二個(gè)參數(shù):block執(zhí)行任務(wù)內(nèi)容

dispatch_async(queue2, ^{

NSLog(@"任務(wù)1 %@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);

});

dispatch_async(queue2, ^{

NSLog(@"任務(wù)2 %@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);

});

dispatch_async(queue2, ^{

NSLog(@"任務(wù)3 %@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);

});

//釋放掉自己的創(chuàng)建的隊(duì)列,出現(xiàn)create就要釋放

dispatch_release(queue2);

*/

//同步任務(wù)

dispatch_sync(queue2, ^{

NSLog(@"任務(wù)1 %@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);

});

dispatch_sync(queue2, ^{

NSLog(@"任務(wù)2 %@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);

});

dispatch_sync(queue2, ^{

NSLog(@"任務(wù)3 %@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);

});

// 總結(jié):同步任務(wù):不管在哪一個(gè)隊(duì)列中都是主線(xiàn)程中執(zhí)行,但是不能將其添加到系統(tǒng)自帶的串行隊(duì)列中;

// 異步任務(wù):在自己創(chuàng)建的串行隊(duì)列中,在子線(xiàn)程中執(zhí)行,如果是系統(tǒng)創(chuàng)建的隊(duì)列在主線(xiàn)程中執(zhí)行;

}```

2.并行隊(duì)列 (線(xiàn)程并發(fā)) 添加到此隊(duì)列的任務(wù)同時(shí)執(zhí)行  假象.
- (IBAction)handleConcurrentQueue:(UIButton *)sender 
{
//1.獲取系統(tǒng)自帶的并行隊(duì)列

//01.隊(duì)列的優(yōu)先級(jí)

//02.預(yù)留參數(shù)  給0

dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//2.自己創(chuàng)建并行隊(duì)列 (一般不自己創(chuàng)建并行隊(duì)列,系統(tǒng)的并行隊(duì)列已經(jīng)夠用了)

dispatch_queue_t queue2 = dispatch_queue_create("com.xcqnzf.xuchang", DISPATCH_QUEUE_CONCURRENT);

//同步任務(wù)

dispatch_sync(queue1, ^{

NSLog(@"同步任務(wù)%@  %d",[NSThread currentThread],[NSThread currentThread].isMainThread);

});

//異步任務(wù)

dispatch_async(queue2, ^{

NSLog(@"任務(wù)1%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);

});

dispatch_async(queue2, ^{

NSLog(@"任務(wù)2%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);

});

dispatch_async(queue2, ^{

NSLog(@"任務(wù)3%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);

//線(xiàn)程間的通信

//由子線(xiàn)程回到主線(xiàn)程

//獲取系統(tǒng)的串行隊(duì)列

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"我回到主線(xiàn)程了");

});

});

//釋放出現(xiàn)create就要釋放

dispatch_release(queue2);

}```

3.分組隊(duì)列:把多個(gè)任務(wù)添加到一個(gè)分組中執(zhí)行,此時(shí)會(huì)在所有的任務(wù)完成后會(huì)自動(dòng)發(fā)一個(gè)通
知,dispatch_group_notifity接收這個(gè)消息,然后在所有任務(wù)完成之后處理.

  • (IBAction)handleGroupQueue:(UIButton *)sender {

//1.創(chuàng)建并行隊(duì)列,并執(zhí)行任務(wù)

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

__block typeof(self)weakSelf = self;

//創(chuàng)建分組異步同步任務(wù)

dispatch_group_t group = dispatch_group_create();

//01.分組名

//02.要添加的隊(duì)列名

//03.要執(zhí)行的任務(wù)

dispatch_group_async(group, queue, ^{

NSURL *urlString = [NSURL URLWithString:kURLString1];

NSData *data1 = [NSData dataWithContentsOfURL:urlString];

//使用數(shù)組存放請(qǐng)求下來(lái)的數(shù)據(jù)

[weakSelf.dataSource addObject:data1];

});

dispatch_group_async(group, queue, ^{

NSURL *url = [NSURL URLWithString:kURLString2];

NSData *data2 = [NSData dataWithContentsOfURL:url];

[weakSelf.dataSource addObject:data2];

});

//分組中的任務(wù)都完成后會(huì)自動(dòng)觸發(fā)下面的方法

dispatch_group_notify(group, queue, ^{

weakSelf.FirstView.image = [UIImage imageWithData:weakSelf.dataSource[0]];

weakSelf.secondView.image = [UIImage imageWithData:weakSelf.dataSource[1]];

});

//釋放分組

dispatch_release(group);

}```

4.障礙隊(duì)列
- (IBAction)handleBarrierQueue:(UIButton *)sender {

//1.使用障礙隊(duì)列只能使用自己創(chuàng)建的并列隊(duì)列,不能使用系統(tǒng)的并行隊(duì)列

dispatch_queue_t  queue = dispatch_queue_create("com.xcqnzf.xuchang", DISPATCH_QUEUE_CONCURRENT);

//2.往并行隊(duì)列中添加任務(wù)

dispatch_async(queue, ^{

NSLog(@"A寫(xiě)入文件");

});

dispatch_async(queue, ^{

NSLog(@"B寫(xiě)入文件");

});

dispatch_async(queue, ^{

NSLog(@"C寫(xiě)入文件");

});

//添加障礙,間隔寫(xiě)入和讀取的任務(wù),障礙任務(wù)之前的任務(wù)都完成了才能繼續(xù)完成障礙任務(wù)后面的任務(wù)

dispatch_barrier_async(queue, ^{

NSLog(@"我是障礙任務(wù),讀取的任務(wù)先等會(huì)");

});

dispatch_async(queue, ^{

NSLog(@"D讀取文件");

});

dispatch_async(queue, ^{

NSLog(@"D讀取文件");

});

dispatch_async(queue, ^{

NSLog(@"E讀取文件");

});

//3.釋放

dispatch_release(queue);

}

只執(zhí)行一次
- (IBAction)handleOnce:(UIButton *)sender {

static  dispatch_once_t oneToken ;

//

dispatch_once(&oneToken, ^{

NSLog(@"有能耐讓我走兩次");

});

}

這里需要寫(xiě)一個(gè)單例

Helper.h

@interface Helper : NSObject

+ (Helper *)shareHelper;

@end

Helper.h

@implementation Helper

static  Helper *helper = nil;

+ (Helper *)shareHelper{

//VIP

static dispatch_once_t oneToken;

dispatch_once(&oneToken, ^{

helper = [[Helper alloc]init];

});

return helper;

}

@end

重復(fù)任務(wù)
- (IBAction)handleRepeat:(UIButton *)sender {

//1.獲取系統(tǒng)的并行隊(duì)列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//2.向隊(duì)列中添加重復(fù)任務(wù)

//01.任務(wù)重復(fù)的次數(shù)

//02.任務(wù)添加到的隊(duì)列名稱(chēng)

//03.當(dāng)前是第幾次重復(fù)這個(gè)任務(wù)

dispatch_apply(10, queue, ^(size_t times) {

NSLog(@"我要吃爆米花,這是我第%ld吃",times);

});

}

延遲任務(wù) 一個(gè)任務(wù)要執(zhí)行的時(shí)候先等上一段時(shí)間再做
- (IBAction)handlePing:(UIButton *)sender {      //創(chuàng)建一個(gè)延遲任務(wù)      

//01. DISPATCH_TIME_NOW 表示從當(dāng)前時(shí)間開(kāi)始     

 //02. 表示過(guò)多少秒才去執(zhí)行任務(wù)    

  //03. 串行的主隊(duì)列 

     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(55 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{          NSLog(@"延遲任務(wù)在主線(xiàn)程中執(zhí)行");      });  

}```
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妒貌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铸豁,死亡現(xiàn)場(chǎng)離奇詭異灌曙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)推姻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)平匈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事增炭∪淘铮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵隙姿,是天一觀的道長(zhǎng)梅垄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)输玷,這世上最難降的妖魔是什么队丝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮欲鹏,結(jié)果婚禮上机久,老公的妹妹穿的比我還像新娘。我一直安慰自己赔嚎,他們只是感情好膘盖,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著尤误,像睡著了一般侠畔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上损晤,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天软棺,我揣著相機(jī)與錄音,去河邊找鬼尤勋。 笑死喘落,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的最冰。 我是一名探鬼主播揖盘,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锌奴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起憾股,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鹿蜀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后服球,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體茴恰,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年斩熊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了往枣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖分冈,靈堂內(nèi)的尸體忽然破棺而出圾另,到底是詐尸還是另有隱情,我是刑警寧澤雕沉,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布集乔,位于F島的核電站,受9級(jí)特大地震影響坡椒,放射性物質(zhì)發(fā)生泄漏扰路。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一倔叼、第九天 我趴在偏房一處隱蔽的房頂上張望汗唱。 院中可真熱鬧,春花似錦丈攒、人聲如沸哩罪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)识椰。三九已至,卻和暖如春深碱,著一層夾襖步出監(jiān)牢的瞬間腹鹉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工敷硅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留功咒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓绞蹦,卻偏偏與公主長(zhǎng)得像力奋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幽七,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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

  • 1. GCD簡(jiǎn)介 什么是GCD呢景殷?我們先來(lái)看看百度百科的解釋簡(jiǎn)單了解下概念 引自百度百科:Grand Centra...
    千尋_544f閱讀 370評(píng)論 0 0
  • 多線(xiàn)程 什么是多線(xiàn)程?多線(xiàn)程就是一個(gè)進(jìn)程中可以開(kāi)啟多條線(xiàn)程,每條線(xiàn)程可以并行執(zhí)行不同的任務(wù),提高執(zhí)行效率;一個(gè)基本...
    西風(fēng)頌閱讀 873評(píng)論 1 16
  • 學(xué)習(xí)多線(xiàn)程,轉(zhuǎn)載兩篇大神的帖子澡屡,留著以后回顧猿挚!第一篇:關(guān)于iOS多線(xiàn)程,你看我就夠了 第二篇:GCD使用經(jīng)驗(yàn)與技巧...
    John_LS閱讀 621評(píng)論 0 3
  • 目錄 一驶鹉、基本概念1.多線(xiàn)程2.串行和并行绩蜻, 并發(fā)3.隊(duì)列與任務(wù)4.同步與異步5.線(xiàn)程狀態(tài)6.多線(xiàn)程方案 二、GC...
    BohrIsLay閱讀 1,588評(píng)論 5 12
  • 前言 嘿嘿嘿室埋,精品办绝。 概述 全稱(chēng)是Grand Central Dispatch伊约,可譯為“牛逼的中樞調(diào)度器”。純C語(yǔ)...
    Ostkaka丶閱讀 1,105評(píng)論 0 12