iOS多線程概述

1.多線程的簡(jiǎn)單認(rèn)知

1.進(jìn)程和線程的認(rèn)知

進(jìn)程:一個(gè)正在運(yùn)行的程序就是一個(gè)進(jìn)程 一個(gè)進(jìn)程由一個(gè)或多個(gè)線程組成進(jìn)程只負(fù)責(zé)資源的調(diào)度分配删豺,線程才是真正的執(zhí)行單元

線程

//當(dāng)我們應(yīng)用程序剛剛運(yùn)行的時(shí)候,系統(tǒng)會(huì)自動(dòng)為我們開放一個(gè)線程吼鳞,這個(gè)線程叫做主線程

//子線程:程序員用代碼手動(dòng)開啟的線程

//子線程存在的意義:執(zhí)行耗時(shí)操作的任務(wù)

//子線程在執(zhí)行完自己的任務(wù)之后會(huì)自動(dòng)銷毀

2.創(chuàng)建線程

第一種

-(void)createNSThread

{

//創(chuàng)建一個(gè)線程###

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(haoshicaozuo) object:@"123"];

thread.name = @"這是一個(gè)線程";

[thread start];

//NSLog(@"%@",thread);

NSLog(@"%@",[NSThread mainThread]);//打印當(dāng)前應(yīng)用程序的主線程

NSLog(@"%@",[NSThread currentThread]);//當(dāng)前線程

NSLog(@"%d",[NSThread isMainThread]); //判斷是否為主線程

}

第二種

-(void)createNSThread1

{

//快捷創(chuàng)建 無返回值

[NSThread detachNewThreadSelector:@selector(haoshicaozuo) toTarget:self withObject:@"456"];

}

第三種

-(void)createNSThread2

{

//隱式開啟線程

[NSThread cancelPreviousPerformRequestsWithTarget:self selector:@selector(haoshicaozuo) object:@"789"];

}

2.NSOperation

/NSOperation 是一個(gè)抽象類,我們一般不直接使用它赔桌,而是使用它的子類NSInvocationOperation 類 還有NSBlockOperation

//如果他們單獨(dú)使用都是在主線程執(zhí)行,只有和隊(duì)列放在一起才是在子線程下執(zhí)行的

-(void)createNSOperation

{

NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationAction1) object:nil];

//[operation1 start];

NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationAction2) object:

nil];

NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{

for (int i = 20 ; i < 30 ; i++)? {

NSLog(@"%d",i);

}}];

//操作隊(duì)列

//目的:是將我們的任務(wù)放在一個(gè)隊(duì)列中執(zhí)行

//任務(wù):任務(wù)執(zhí)行在主線程還是在子線程全都是由我們的隊(duì)列來決定的

//加入到隊(duì)列

//mainQueue 代表主隊(duì)列

//如果 alloc init 的就代表其他隊(duì)列

//? NSOperationQueue *queue = [NSOperationQueue mainQueue];

NSOperationQueue *queue = [[NSOperationQueue alloc] init] ;

//先加的先執(zhí)行音诫,后加的后執(zhí)行,但執(zhí)行的時(shí)間不一定 可能后邊的現(xiàn)執(zhí)行完

[queue addOperation:operation1];

[queue addOperation:operation2];

[queue addOperation:operation3];

}

-(void)operationAction2

{

NSLog(@"%d",[NSThread isMainThread]);

}

-(void)operationAction1

{

NSLog(@"%d",[NSThread isMainThread]);

}

3.GCD

在了解GCD之前我們應(yīng)該先了解幾個(gè)基礎(chǔ)概念

異步:不再一個(gè)線程執(zhí)行

同步:在同一個(gè)線程執(zhí)行

串行:按順序串在一起執(zhí)行

并行:一起執(zhí)行

#pragma --------- 同步主隊(duì)列 ------------

//同步不能加主隊(duì)列 所以這個(gè)是錯(cuò)的竭钝,僅僅是看個(gè)模式

-(void)createScyMain

{

//獲得主隊(duì)列(主隊(duì)列也是一個(gè)串行隊(duì)列)

dispatch_queue_t queue = dispatch_get_main_queue();

//將任務(wù)加到隊(duì)列中

//第一個(gè)參數(shù):放隊(duì)列的

//第二個(gè)參數(shù):要執(zhí)行的任務(wù)

dispatch_sync(queue, ^{

NSLog(@"1.......%@",[NSThread currentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"2.......%@",[NSThread currentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"3.......%@",[NSThread currentThread]);

});

}

#pragma --------- 異步主隊(duì)列 ------------

//不開辟線程,就在主線程執(zhí)行

-(void)createAsycnMain

{

//獲得主隊(duì)列(主隊(duì)列也是一個(gè)串行隊(duì)列)

dispatch_queue_t queue = dispatch_get_main_queue();

dispatch_async(queue, ^{

NSLog(@"1..........%@",[NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"2..........%@",[NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"3..........%@",[NSThread currentThread]);

});

}

#pragma --------- 同步串行隊(duì)列 ------------

//不具備開啟線程的能力香罐,在當(dāng)前線程完成任務(wù)

-(void)createSyncSerial

{

//創(chuàng)建串行隊(duì)列

dispatch_queue_t queue = dispatch_queue_create("aaa.com", DISPATCH_QUEUE_SERIAL);

dispatch_sync(queue, ^{

NSLog(@"1........%@",[NSThread currentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"2........%@",[NSThread currentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"3........%@",[NSThread currentThread]);

});

}

#pragma --------- 異步串行隊(duì)列 ------------

//具備開啟線程的能力时肿,但是任務(wù)是串行的

-(void)createAsyncSerial

{

dispatch_queue_t queue = dispatch_queue_create("aaa.com", DISPATCH_QUEUE_SERIAL);

dispatch_async(queue, ^{

NSLog(@"1........%@",[NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"2.......%@",[NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"3........%@",[NSThread currentThread]);

});

}

#pragma --------- 同步并行隊(duì)列 ------------

//不具備開啟線程的能力庇茫,其實(shí)同步的都在主線程螃成,主線程沒有串行隊(duì)列 ,所以并行的功能就沒有用了

-(void)createSyncConcurrent

{

//創(chuàng)建一個(gè)并發(fā)隊(duì)列

//第一個(gè)參數(shù) 隊(duì)列的名字

//第二個(gè)參數(shù) 類型

//我們自己創(chuàng)建的并發(fā)隊(duì)列

// dispatch_queue_t queue = dispatch_queue_create("sb.com", DISPATCH_QUEUE_CONCURRENT);

//獲得全局的并發(fā)隊(duì)列

//第一個(gè)參數(shù)是優(yōu)先級(jí)寸宏,默認(rèn)的就行了

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_sync(queue, ^{

NSLog(@"1.........%@",[NSThread currentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"2.........%@",[NSThread currentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"3.........%@",[NSThread currentThread]);

});

}

#pragma --------- 異步并行隊(duì)列 ------------

//最經(jīng)常使用的就是這個(gè)

//異步具備開啟子線程的能力,并且并行執(zhí)行任務(wù)

-(void)createAsynConcurrent

{

//獲得全局的并發(fā)隊(duì)列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{

NSLog(@"1.......%@",[NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"2.......%@",[NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"3.......%@",[NSThread currentThread]);

});

NSLog(@"大傻逼");

}

4-GCD網(wǎng)絡(luò)請(qǐng)求的應(yīng)用

以請(qǐng)求一張圖片為例我們?cè)赩iewController的viewDidLoad里面要寫上如下代碼

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

//創(chuàng)建全局的并發(fā)隊(duì)列

dispatch_queue_t? queue = dispatch_queue_create("aaa", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{

NSURL *url = [NSURL URLWithString: @"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1464140268&di=6b6b2e3ea5da34b7da1e02fd28c7acd2&src=http://pic36.nipic.com/20131115/12106414_153522431000_2.jpg"];

NSData *data = [NSData dataWithContentsOfURL:url];

dispatch_async(dispatch_get_main_queue(), ^{

//UI層的東西只有回到主線程里才能設(shè)置

self.imgView.image? = [UIImage imageWithData:data];

});

});

}

5-GCD函數(shù)的使用

延時(shí)執(zhí)行

-(void)creatAfter

{

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

NSLog(@"%@",[NSThread currentThread]);

NSLog(@"皮卡皮卡氮凝,皮卡丘");

});

}

快速遍歷

-(void)rapidTeaverse

{

for (int i = 0; i < 10; i++) {

NSLog(@"%d",i);

}

dispatch_queue_t queue =? dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

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

NSLog(@"%zd %@",index,[NSThread currentThread]);

});

}

組隊(duì)列

-(void)creatGroup

{

//獲取并行隊(duì)列

dispatch_queue_t queue =? dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//創(chuàng)建一個(gè)組隊(duì)列

dispatch_group_t group = dispatch_group_create();

//下載圖片1

dispatch_group_async(group, queue, ^{

NSURL *url = [NSURL URLWithString:@"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1464231860&di=33256b2f206f8082ad634b5250a2b39d&src=http://www.benbenla.cn/images/20120330/benbenla-04b.jpg"];

NSData *data = [NSData dataWithContentsOfURL:url];

self.image1 = [UIImage imageWithData:data];

});

dispatch_group_async(group, queue, ^{

NSURL *url = [NSURL URLWithString:@"http://www.deskcar.com/desktop/fengjing/200895150214/21.jpg"];

NSData *data = [NSData dataWithContentsOfURL:url];

self.image2 = [UIImage imageWithData:data];

});

//將圖片1和2組合在一起

dispatch_group_notify(group, queue, ^{

//開啟一個(gè)新的圖片上下文

UIGraphicsBeginImageContext(CGSizeMake(375, 667));

//繪制圖片

[self.image1 drawInRect:CGRectMake(0, 0, 375/2, 667)];

[self.image2 drawInRect:CGRectMake(375/2, 0, 375/2, 667)];

//取得圖片上下文中的圖片

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

//結(jié)束圖片上下文

UIGraphicsEndImageContext();

dispatch_async(dispatch_get_main_queue(), ^{

self.imgV.image = image;

});

});

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末羔巢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子覆醇,更是在濱河造成了極大的恐慌朵纷,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件永脓,死亡現(xiàn)場(chǎng)離奇詭異袍辞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)常摧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門搅吁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來威创,“玉大人,你說我怎么就攤上這事谎懦《遣颍” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵吸申,是天一觀的道長享甸。 經(jīng)常有香客問我截碴,道長蛉威,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任蚯嫌,我火速辦了婚禮,結(jié)果婚禮上择示,老公的妹妹穿的比我還像新娘。我一直安慰自己栅盲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拴签,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚓哩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天岸梨,我揣著相機(jī)與錄音,去河邊找鬼曹阔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赃份,可吹牛的內(nèi)容都是我干的奢米。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鬓长,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼尝江!你這毒婦竟也來了涉波?” 一聲冷哼從身側(cè)響起炭序,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎少态,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彼妻,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年屋摇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炮温。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柒啤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情担巩,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布涛癌,位于F島的核電站送火,受9級(jí)特大地震影響拳话,放射性物質(zhì)發(fā)生泄漏种吸。R本人自食惡果不足惜弃衍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一坚俗、第九天 我趴在偏房一處隱蔽的房頂上張望姜钳。 院中可真熱鬧,春花似錦哥桥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽送滞。三九已至,卻和暖如春犁嗅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褂微。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宠蚂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓求厕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呀癣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • NSThread 第一種:通過NSThread的對(duì)象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 799評(píng)論 0 3
  • 在這篇文章中十艾,我將為你整理一下 iOS 開發(fā)中幾種多線程方案腾节,以及其使用方法和注意事項(xiàng)。當(dāng)然也會(huì)給出幾種多線程的案...
    張戰(zhàn)威ican閱讀 603評(píng)論 0 0
  • 一案腺、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關(guān)多線程的基本概念康吵。本篇博文介紹的是iOS中常用的幾個(gè)多...
    nuclear閱讀 2,050評(píng)論 6 18
  • 陸玖是一張木床劈榨。 它不同于世上任何一張木床晦嵌。 它有思想有床格拷姿。 能夠像人一樣思考的陸玖為什么成了一張床呢? 這就是...
    啊小美閱讀 694評(píng)論 0 5