GCD簡介:
全稱是Grand Central?Dispatch,可譯為“牛逼的中樞調度器”純C語言,提供了非常多強大的函數.
GCD的優勢:
GCD是蘋果公司為多核的并行運算提出的解決方案,GCD會自動利用更多的CPU內核(比如雙核、四核),GCD會自動管理線程的生命周期(創建線程、調度任務、銷毀線程),程序員只需要告訴GCD想要執行什么任務,不需要編寫任何線程管理代碼
GCD有兩個核心概念, 一個是任務, 一個是隊列, GCD的使用步驟就是定制任務,然后將任務添加到隊列中,然后GCD會自動將隊列的任務取出來,放到對應的線程中.任務取出來遵循隊列的FIFO原則:先進先出,后進后出.
GCD有兩個用來執行任務的常用函數.
1.用同步方式執行任務函數
dispatch_sync(dispatch_queue_t ?queue, dispatch_block_t ?block);
2.用異步方式執行任務函數
dispatch_async(dispatch_queue_t queue, dispatch_block_t? ? block);
同步和異步的區別
同步:只能在當前線程中執行任務,不具備開啟新線程的能力
異步:可以在新的線程中執行任務,具備開啟新線程的能力
重中之重: queue:隊列 , ? ?block:任務
1.1隊列的類型(有并發隊列和串行隊列)
GCD的隊列可以分為2大類型
(1)并發隊列(Concurrent Dispatch Queue)可以讓多個任務并發(同時)執行(自動開啟多個線程同時執行任務),并發功能只有在異步(dispatch_async)函數下才有效
@1創建并發隊列 ?dispatch_queue_t queue = dispatch_queue_create("com.520it.queue",DISPATCH_QUEUE_CONCURRENT);
@2全局并發隊列:GCD默認已經提供了全局的并發隊列,供整個應用使用,可以無需手動創建
獲得全局并發隊列 ?dispatch_queue_t ?queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
(2)串行隊列(Serial Dispatch Queue)讓任務一個接著一個地執行(一個任務執行完畢后,再執行下一個任務)
@1創建串行隊列 ? ?dispatch_queue_t queue = dispatch_queue_create("com.520it.queue", NULL);?
@2使用主隊列(跟主線程相關聯的隊列)主隊列是GCD自帶的一種特殊的串行隊列,放在主隊列中的任務,都會放到主線程中執行,使用dispatch_get_main_queue()獲得主隊列.
dispatch_queue_t ? queue = dispatch_get_main_queue();
2.下面就開始實例講解怎么使用
普通的使用:從子線程回到主線程,創建一個異步函數,然后獲取一個全局隊列,把任務添加到函數里面,然后將隊列中的任務取出來執行.
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIO RITY_DEFAULT,
? 0),^{//執行耗時的異步操作...
? ? ? ? ? ? dispatch_async(dispatch_get_main_queue(),
? ? ? ? ? ? ? ^{ ?//回到主線程,執行UI刷新操作
? ? ? ? ? ? ? ? });
});
3.總結:GCD在代碼中使用的幾種函數類型.
3.1:延時函數
3.2 一次性函數:這種函數機制主要使用在單例模式中.
3.3快速迭代函數:開啟多線程快速無序的迭代,可用在從一個文件復制黏貼到其他 文件夾里面,這樣能節約很多時間
3.4 隊列組函數
3.5 柵欄函數 ,注意點就是柵欄函數不能使用全局并發函數.
dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);
//1.異步函數
dispatch_async(queue, ^{
for (NSInteger i = 0; i<100; i++) {
NSLog(@"download1-%zd-%@",i,[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (NSInteger i = 0; i<100; i++) {
NSLog(@"download2-%zd-%@",i,[NSThread currentThread]);
}
});
//柵欄函數
dispatch_barrier_async(queue, ^{
NSLog(@"+++++++++++++++++++++++++++++");
});
dispatch_async(queue, ^{
for (NSInteger i = 0; i<100; i++) {
NSLog(@"download3-%zd-%@",i,[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (NSInteger i = 0; i<100; i++) {
NSLog(@"download4-%zd-%@",i,[NSThread currentThread]);
}
});