Objetive-C學習_GCD學習筆記,objetive-c_gcd
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原則 : 先進先出,後進後出