GCD : 蘋果為多核的并行運算提出的解決方法
GCD會自動管理線程的生命周期(創建線程、調度任務、銷毀線程)
隊列 : 用來存放任務(串行隊列、并行隊列)
任務 : 執行什么操作(同步、異步)
并發 : 多個任務同時執行
串行 : 一個任務執行完畢后,再執行下一個任務
| 全局并發隊列(多條) | 手動創建串行隊列(1條) | 主隊列(0條) |
同步(sync) 需要0條 | 沒有開啟新線程 串行執行任務 | 沒有開啟新線程 串行執行任務 | 沒有開啟新線程 串行執行任務 |
異步(async) 需要多條 | 有開啟新線程 并發執行任務 | 有開啟新線程 串行執行任務 | 沒有開啟新線程 串行執行任務 |
我的記憶方法(僅僅是記憶方法): 把隊列看成具有新開線程的能力,但是他們能力有限不能無限開,把任務看成需要線程的數量。根據需求和隊列能力得到最后的先開線程的數量(數量如表格)。
對應方法 :
同步方式執行任務 : dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
異步方式執行任務 : dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
獲取全局并發隊列 : dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
創建串行隊列 : dispatch_queue_create(const char *label, dispatch_queue_attr_t attr); // 隊列名稱、隊列屬性(一般用NULL即可)
獲得主隊列 : dispatch_get_main_queue();
延時函數 :
(1) [self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)];//對象方法,只能在當前的線程還要寫一個方法
(2) dispatch_after(dispatch_time(dispatch_time_t when, int64_t delta), dispatch_queue_t queue, ^(void)block)
參數說明 :
//when可以設置為0也可以用DISPATCH_TIME_NOW,表示從現在開始
//delta 一般傳入 (int64_t)(X * NSEC_PER_SEC) 其中X表示多少秒后
//NSEC_PER_SEC打印出來是1000000000
// dispatch_time_t其實是unsigned long long
// int64_t 其實是 long long
單例模式 :
+(id)ShareManager
{
static MyManager * staticInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
staticInstance = [[self alloc]init];
});
return staticInstance;
}
隊列組使用步驟: (多個耗時操作都完成之后執行操作)
1.創建隊列組 :dispatch_group_t group = dispatch_group_create();
2.創建組任務添加到組中 :dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, ^(void)block);
3.等隊列組里面的任務都執行完畢再執行其他操作 : dispatch_group_notify(dispatch_group_t group, dispatch_queue_t queue, ^(void)block);
注意點和知識點 :
(1 )如果使用的是非ARC,創建隊列也要釋放,凡是函數名中帶有create/copy/new/retain,都需要在不需要使用這個數據的時候進行release。但是CF(core Foudation)的數據類型在ARC環境下還是要release
(2)同步函數不能放在主線程中,在主線程往主隊列中添加任務(會卡?。?。因為串行隊列是執行一個任務完才會執行下一個
(3)GCD已經提供了全局的并發隊列,供整個應用使用,不需要手動創建;串行隊列要自己創建。
(4) 任務的取出隊列FIFO原則 : 先進先出,后進后出
新聞熱點
疑難解答