//
// ViewController.m
// GCDDemo1
//
// Created by WangZhi on 16/6/3.
// Copyright ? 2016年 WangZhi. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"%@", [NSThread currentThread]);
// GCD核心:將 操作/任務(wù) 放到 隊(duì)列 中
// [self GCD1];
// [self GCD2];
// [self GCD3];
[self GCD4];
}
?
#pragma mark - 串行隊(duì)列
- (void)GCD1 {
// 特點(diǎn): 可以保證效率(會(huì)新建一個(gè)子線程),能夠?qū)崿F(xiàn)并發(fā)! (因?yàn)樾陆ㄗ泳€程是有開銷的,所以不能無(wú)休止的新建線程.)
// 使用串行隊(duì)列的異步任務(wù)非常非常非常有用!!!
// 應(yīng)用場(chǎng)景: 從網(wǎng)絡(luò)上下載圖片,然后加濾鏡處理
// 在C語(yǔ)言函數(shù)中,定義類型絕大多數(shù)都是以_t或ref結(jié)尾的.
dispatch_queue_t q = dispatch_queue_create("Queue1", DISPATCH_QUEUE_SERIAL); // 串行隊(duì)列
// 非ARC開發(fā)環(huán)境中,千萬(wàn)別忘記release
// dispatch_release(q);
// 1. 串行隊(duì)列的同步任務(wù)
for (int i = 0; i < 10; i++) {
dispatch_sync(q, ^{ // 同步任務(wù),順序執(zhí)行,會(huì)在主線程上運(yùn)行(在開發(fā)中極少用)
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
}
// 2. 串行隊(duì)列的異步任務(wù)
for (int i = 0; i < 10; i++) {
dispatch_async(q, ^{ // 異步任務(wù),順序執(zhí)行,會(huì)在子線程上運(yùn)行(會(huì)新建一個(gè)子線程) (異步任務(wù),并發(fā)執(zhí)行,但如果在串行隊(duì)列中,仍然會(huì)依次順序執(zhí)行)
// [NSThread currentThread]:可以在開發(fā)中,跟蹤當(dāng)前線程
// number = 1,表示主線程; number = 2,表示第二個(gè)子線程,以此類推.
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
}
}
#pragma mark - 并行隊(duì)列
- (void)GCD2 {
// 特點(diǎn): 沒(méi)有隊(duì)形,執(zhí)行順序程序員不能控制!!!
// 缺點(diǎn): 并行隊(duì)列易出錯(cuò),并且不能控制新建子線程的數(shù)量.
// 應(yīng)用場(chǎng)景: 并發(fā)執(zhí)行任務(wù),沒(méi)有先后順序
dispatch_queue_t q = dispatch_queue_create("Queue2", DISPATCH_QUEUE_CONCURRENT); // 并行隊(duì)列
// 1. 并行隊(duì)列的同步任務(wù)
for (int i = 0; i < 10; i++) {
dispatch_sync(q, ^{ // 同步任務(wù),順序執(zhí)行,會(huì)在主線程上運(yùn)行
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
}
// 2. 并行隊(duì)列的異步任務(wù)
for (int i = 0; i < 10; i++) {
dispatch_async(q, ^{ // 異步任務(wù),并發(fā)執(zhí)行,會(huì)在子線程上運(yùn)行(可能會(huì)新建多個(gè)子線程)
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
}
}
#pragma mark - 全局隊(duì)列:蘋果為了方便多線程的設(shè)計(jì),提供了一個(gè)全局隊(duì)列,供所有的APP共同使用
- (void)GCD3 {
// 全局隊(duì)列與并行隊(duì)列的區(qū)別:
// - 不需要?jiǎng)?chuàng)建,直接get就可以獲得;
// - 全局隊(duì)列沒(méi)有名稱,調(diào)試時(shí),無(wú)法確認(rèn)準(zhǔn)確隊(duì)列;
// - 與并行隊(duì)列執(zhí)行效果相同,屬于并行隊(duì)列類型.
dispatch_queue_t global_q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 第二個(gè)參數(shù)flags傳0,原因:Reserved for future use. Passing any value other than zero may result in a NULL return value. (保留供將來(lái)使用.傳遞除零以外的任何值可能會(huì)導(dǎo)致NULL返回值.)
// 1. 全局隊(duì)列的同步任務(wù)
for (int i = 0; i < 10; i++) {
dispatch_sync(global_q, ^{ // 同步任務(wù),順序執(zhí)行,會(huì)在主線程上運(yùn)行
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
}
// 2. 全局隊(duì)列的異步任務(wù)
for (int i = 0; i < 10; i++) {
dispatch_async(global_q, ^{ // 異步任務(wù),并發(fā)執(zhí)行,會(huì)在子線程上運(yùn)行(可能會(huì)新建多個(gè)子線程)
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
}
}
#pragma mark - 主隊(duì)列(主線程): 保證操作在主線程上執(zhí)行
- (void)GCD4 {
// 每一個(gè)應(yīng)用程序都只有一個(gè)主線程.
// - 為什么需要在主線程上工作呢?原因:在iOS開發(fā)中,所有UI的更新工作都必須在主線程上執(zhí)行.
// - 主隊(duì)列屬于串行隊(duì)列類型.
dispatch_queue_t main_q = dispatch_get_main_queue();
// 線程阻塞了! 原因:主線程是有工作的,而且除非將程序kill掉,否則主線程的工作永遠(yuǎn)不會(huì)結(jié)束,所以不會(huì)執(zhí)行到 NSLog(@"main_q %@", [NSThread currentThread]); 這一行代碼.
// 1. 主隊(duì)列的同步任務(wù)
// dispatch_sync(main_q, ^{ // 同步任務(wù),順序執(zhí)行
// NSLog(@"main_q %@", [NSThread currentThread]); // 進(jìn)入斷點(diǎn)
// });
// 2. 主隊(duì)列的異步任務(wù)
for (int i = 0; i < 10; i++) {
dispatch_async(main_q, ^{ // 異步任務(wù),在主線程中會(huì)依次順序執(zhí)行
NSLog(@"%@ - %d", [NSThread currentThread], i);
});
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
iOS開發(fā)中的四種GCD
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 多線程實(shí)現(xiàn)的幾種方案 GCD的簡(jiǎn)介 GCD中有兩個(gè)很重要的概念: 任務(wù) 、隊(duì)列。隊(duì)列中存放的就是多個(gè)任務(wù),隊(duì)列的執(zhí)...
- 在前面一篇文章里, 我們大概知道了GCD是個(gè)什么概念, 也知道了如何創(chuàng)建隊(duì)列, 創(chuàng)建任務(wù), 但前面的都只是理念, ...
- 在這個(gè)現(xiàn)實(shí)與虛無(wú)交織大陸上,矗立著五個(gè)鼎盛的大國(guó),分別是:金圣國(guó),木靈國(guó),水仙國(guó),火魔國(guó),土神國(guó)。金圣國(guó)兵器鍛...