下面主要介紹一下GCD(Grand Central Dispatch)的一般用法,理解好的話對以後的多線程開發是非常有幫助的。
個人認爲GCD有兩大優點
優點一、自動管理線程的生命週期(創建、調度、銷燬)
優點二、合理利用CPU內核,達到物盡其用。
核心概念
概念一、任務:執行什麼操作 (dispatch_sync:同步,不具備開啓線程的能力 dispatch_async: 異步,具備開啓線程的能力)
概念二、隊列:存放任務(併發隊列:多個任務可以同時執行 串行隊列:一個任務執行完畢後,再執行下一個任務)
其實,我們但凡用到多線程都希望其具備開啓線程的能力,並且不在主線程中操作。(純屬個人理解)一般會用到下面幾種方法。
下面的方法偶爾會用到
/**
* async -- 串行隊列(有時候用)
* 會不會創建線程:會,一般只開1條線程
* 任務的執行方式:串行執行(一個任務執行完畢後再執行下一個任務)
*/
- (void)asyncSerialQueue
{
// 1.創建一個串行隊列
dispatch_queue_t queue = dispatch_queue_create("queue", NULL);
// 2.將任務添加到串行隊列中 異步 執行
dispatch_async(queue, ^{
NSLog(@"-----下載圖片1---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下載圖片2---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下載圖片3---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下載圖片4---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下載圖片5---%@", [NSThread currentThread]);
});
}
下面方法常用
/**
* async -- 主隊列(很常用)
*/
- (void)asyncMainQueue
{
// 1.主隊列(添加到主隊列中的任務,都會自動放到主線程中去執行)
dispatch_queue_t queue = dispatch_get_main_queue();
// 2.添加 任務 到主隊列中 異步 執行
dispatch_async(queue, ^{
NSLog(@"-----下載圖片1---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下載圖片2---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下載圖片3---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下載圖片4---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下載圖片5---%@", [NSThread currentThread]);
});
}
下面方法最常用,(如我的想法理解一樣)
/**
* async -- 併發隊列(最常用)
* 會不會創建線程:會,一般同時開多條
* 任務的執行方式:併發執行
*/
- (void)asyncGlobalQueue
{
// 獲得全局的併發隊列
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]);
});
dispatch_async(queue, ^{
NSLog(@"-----下載圖片4---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下載圖片5---%@", [NSThread currentThread]);
});
}