GCD Grand Central Dispatch
(GCD) 字面意思 宏大的中央排程器 反正就是很牛逼吧
在 gcd 中并不叫多線程開發,因為開發者并不涉及線程的開啟和關閉以及排程. 隻是操作任務在隊列中, 所有關于線程的事都是有 GCD 幫我們去做的;
線程的開啟線程的以及操作都是通過 GCD 完成的 是以開發者并不牽扯到線程的排程;隻是排程的任務.具體開多少線程 什麼時候開都有系統自己去操作
主隊列 & 串行隊列的差別?
一個一個安排任務,隊列特點:FIFO
-并發隊列:可以排程多個任務
-串行隊列:必須等待一個任務執行完成,再排程另外一個任務。最多隻能開啟一個線程。
-主隊列:以FIFO排程任務,如果主線程删共有任何任務在執行,主隊列就不會排程任務,主要負責在主線程上執行任務!
全局隊列
/*
ios 7
DISPATCH_QUEUE_PRIORITY_HIGH 2 高優先級
DISPATCH_QUEUE_PRIORITY_DEFAULT 0 預設優先級
DISPATCH_QUEUE_PRIORITY_LOW (-2) 低優先級
DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 非常低 基本忽略
ios 8 使用者體驗度
* - QOS_CLASS_USER_INTERACTIVE 使用者互動
* - QOS_CLASS_USER_INITIATED 使用者使用
* - QOS_CLASS_DEFAULT 預設使用
* - QOS_CLASS_UTILITY 使用工具
* - QOS_CLASS_BACKGROUND 背景使用
預留參數
*/
dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{
NSLog(@"異步");
});
并發異步
/**
并發異步 開啟異步線程 執行順序 無序
第一個參數: 線程辨別符
第二個參數:DISPATCH_QUEUE_CONCURRENT 并發隊列
*/
dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 100 ; i ++ ) {
dispatch_async(q, ^{
NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]);
});
}
并發同步
/**
并發同步 不開啟線程 按順序執行
1 線程辨別符
2 線程狀态, DISPATCH_QUEUE_CONCURRENT 并發隊列
*/
dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 100 ; i ++ ) {
dispatch_sync(q, ^{
NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]);
});
}
串行同步
/**
串行同步 不開啟線程 按順序執行
*/
dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_SERIAL);
for (int i = 0; i < 100 ; i ++ ) {
dispatch_sync(q, ^{
NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]);
});
}
串行異步
/**
串行異步 開啟子線程線程 按順序執行
*/
dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_SERIAL);
for (int i = 0; i < 100 ; i ++ ) {
dispatch_async(q, ^{
NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]);
});
}
線程組
//建立線程
dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT);
//建立線程組
dispatch_group_t g = dispatch_group_create();
dispatch_group_async(g, q, ^{
});
//添加任務到線程組
dispatch_group_async(g, q, ^{
});
dispatch_group_async(g, q, ^{
});
dispatch_group_async(g, q, ^{
});
/**
所有任務完成在 制定的線程通知任務完成
*/
dispatch_group_notify(g, dispatch_get_main_queue(), ^{
});
單次執行
/*
隻執行一次
*/
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"隻執行一次線程");
});
//通常應用于建立單例 保證線程安全