GCD是Grand Central Dispatch的縮寫,是蘋果對多核硬體上執行併發程式碼的一種支援。它有以下優點:
- GCD通過把計算密集型任務放於後臺執行,以此提高APP的響應速度。
- GCD提供了更簡單的併發模型,它優於執行緒鎖,並且幫助你避免併發bug。
- GCD基於底層、高效能的優化常規型別的程式碼,例如單例。
GCD常用方法介紹:
- 後臺執行
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//後臺執行程式碼段
});
複製程式碼
- 主執行緒執行程式碼
dispatch_async(dispatch_get_main_queue(), ^{
//主執行緒執行程式碼段
});
複製程式碼
- 一次性執行(多用於單例模式)
static dispatch_once_t once;
dispatch_once(&once, ^{
//只執行一次的程式碼段
});
複製程式碼
- 延遲操作執行
float delaySeconds = 3.0f;
dispatch_time_t disTime = dispatch_time(DISPATCH_TIME_NOW, delaySeconds * NSEC_PER_SEC);
dispatch_after(disTime, dispatch_get_main_queue(), ^{
//延遲執行的程式碼段
});
複製程式碼
- 建立序列佇列,一次只能執行一個任務, 當前任務完成才開始出列並啟動下一個任務
dispatch_queue_t serialQueue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
//code 任務一
NSLog(@"序列佇列:任務一");
});
dispatch_async(serialQueue, ^{
//code 任務二
NSLog(@"序列佇列:任務二");
});
複製程式碼
- 建立並行佇列,儘可能多地啟動任務併發執行
dispatch_queue_t concurrentQueue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQueue, ^{
//code 任務一
NSLog(@"並行佇列:任務一");
});
dispatch_async(concurrentQueue, ^{
//code 任務二
NSLog(@"並行佇列:任務二");
});
複製程式碼
- 讓後臺多個執行緒並行執行,然後等整個group的執行緒都結束後,再彙總執行結果
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
//並行執行緒一
NSLog(@"notify:並行執行緒一");
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
//並行執行緒二
NSLog(@"notify:並行執行緒二");
});
//會等整個group執行完才執行操作
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
//彙總結果
NSLog(@"notify:任務一二三都執行完成");
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
//並行執行緒三
NSLog(@"notify:並行執行緒三");
});
複製程式碼
- 讓後臺多個執行緒並行執行,然後上面的執行緒都執行結束後,再彙總執行後面的執行緒
dispatch_queue_t conCurrentQueue = dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(conCurrentQueue, ^{
//並行執行緒一
NSLog(@"barrier:並行執行緒一");
});
dispatch_async(conCurrentQueue, ^{
//並行執行緒二
NSLog(@"barrier:並行執行緒二");
});
dispatch_barrier_async(conCurrentQueue, ^{
//彙總一二執行緒
NSLog(@"barrier:任務一二都執行完成");
});
dispatch_async(conCurrentQueue, ^{
//並行執行緒三
NSLog(@"barrier:並行執行緒三");
});
dispatch_async(conCurrentQueue, ^{
//並行執行緒四
NSLog(@"barrier:並行執行緒四");
});
複製程式碼
以後若有其他應用場景,再行補充。若有寫得不好的地方,請大家指出。