GCD : 蘋果為多核的并行運算提出的解決方法
GCD會自動管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)、銷毀線程)
隊列 : 用來存放任務(wù)(串行隊列、并行隊列)
任務(wù) : 執(zhí)行什么操作(同步、異步)
并發(fā) : 多個任務(wù)同時執(zhí)行
串行 : 一個任務(wù)執(zhí)行完畢后,再執(zhí)行下一個任務(wù)
| 全局并發(fā)隊列(多條) | 手動創(chuàng)建串行隊列(1條) | 主隊列(0條) |
同步(sync) 需要0條 | 沒有開啟新線程 串行執(zhí)行任務(wù) | 沒有開啟新線程 串行執(zhí)行任務(wù) | 沒有開啟新線程 串行執(zhí)行任務(wù) |
異步(async) 需要多條 | 有開啟新線程 并發(fā)執(zhí)行任務(wù) | 有開啟新線程 串行執(zhí)行任務(wù) | 沒有開啟新線程 串行執(zhí)行任務(wù) |
我的記憶方法(僅僅是記憶方法): 把隊列看成具有新開線程的能力,但是他們能力有限不能無限開,把任務(wù)看成需要線程的數(shù)量。根據(jù)需求和隊列能力得到最后的先開線程的數(shù)量(數(shù)量如表格)。
對應(yīng)方法 :
同步方式執(zhí)行任務(wù) : dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
異步方式執(zhí)行任務(wù) : dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
獲取全局并發(fā)隊列 : dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
創(chuàng)建串行隊列 : dispatch_queue_create(const char *label, dispatch_queue_attr_t attr); // 隊列名稱、隊列屬性(一般用NULL即可)
獲得主隊列 : dispatch_get_main_queue();
延時函數(shù) :
(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)
參數(shù)說明 :
//when可以設(shè)置為0也可以用DISPATCH_TIME_NOW,表示從現(xiàn)在開始
//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;
}
隊列組使用步驟: (多個耗時操作都完成之后執(zhí)行操作)
1.創(chuàng)建隊列組 :dispatch_group_t group = dispatch_group_create();
2.創(chuàng)建組任務(wù)添加到組中 :dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, ^(void)block);
3.等隊列組里面的任務(wù)都執(zhí)行完畢再執(zhí)行其他操作 : dispatch_group_notify(dispatch_group_t group, dispatch_queue_t queue, ^(void)block);
注意點和知識點 :
(1 )如果使用的是非ARC,創(chuàng)建隊列也要釋放,凡是函數(shù)名中帶有create/copy/new/retain,都需要在不需要使用這個數(shù)據(jù)的時候進行release。但是CF(core Foudation)的數(shù)據(jù)類型在ARC環(huán)境下還是要release
(2)同步函數(shù)不能放在主線程中,在主線程往主隊列中添加任務(wù)(會卡住)。因為串行隊列是執(zhí)行一個任務(wù)完才會執(zhí)行下一個
(3)GCD已經(jīng)提供了全局的并發(fā)隊列,供整個應(yīng)用使用,不需要手動創(chuàng)建;串行隊列要自己創(chuàng)建。
(4) 任務(wù)的取出隊列FIFO原則 : 先進先出,后進后出
新聞熱點
疑難解答