GCD初步認識,GCD認識

來源:互聯網
上載者:User

GCD初步認識,GCD認識

//(1)用非同步函數往並發隊列中新增工作,//總結:同時開啟三個子線程- (void)test1 {    //1.獲得全域的並發隊列        dispatch_queue_t queue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);         //2.新增工作到隊列中,就可以執行任務         //非同步函數:具備開啟新線程的能力         dispatch_async(queue, ^{                 NSLog(@"下載圖片1----%@",[NSThread currentThread]);             });         dispatch_async(queue, ^{                 NSLog(@"下載圖片2----%@",[NSThread currentThread]);             });         dispatch_async(queue, ^{                 NSLog(@"下載圖片3----%@",[NSThread currentThread]);             });     //列印主線程         NSLog(@"主線程----%@",[NSThread mainThread]);}
//(2)用非同步函數往串列隊列中新增工作//總結:會開啟線程,但是只開啟一個線程- (void)test2 {            //列印主線程         NSLog(@"主線程----%@",[NSThread mainThread]);         //建立串列隊列         dispatch_queue_t  queue= dispatch_queue_create("tqh", NULL);         //第一個參數為串列隊列的名稱,是c語言的字串         //第二個參數為隊列的屬性,一般來說串列隊列不需要賦值任何屬性,所以通常傳空值(NULL)            //2.新增工作到隊列中執行         dispatch_async(queue, ^{                 NSLog(@"下載圖片1----%@",[NSThread currentThread]);             });         dispatch_async(queue, ^{                 NSLog(@"下載圖片2----%@",[NSThread currentThread]);             });         dispatch_async(queue, ^{                 NSLog(@"下載圖片3----%@",[NSThread currentThread]);             });             //3.釋放資源     //    dispatch_release(queue);}
//3)用同步函數往並發隊列中新增工作//總結:不會開啟新的線程,並發隊列失去了並發的功能- (void)test3 {    //列印主線程         NSLog(@"主線程----%@",[NSThread mainThread]);             //建立串列隊列         dispatch_queue_t  queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);                 //2.新增工作到隊列中執行         dispatch_sync(queue, ^{                 NSLog(@"下載圖片1----%@",[NSThread currentThread]);             });         dispatch_sync(queue, ^{                 NSLog(@"下載圖片2----%@",[NSThread currentThread]);             });         dispatch_sync(queue, ^{                 NSLog(@"下載圖片3----%@",[NSThread currentThread]);             });}
//(4)用同步函數往串列隊列中新增工作//總結:不會開啟新的線程- (void)test4 {    NSLog(@"用同步函數往串列隊列中新增工作");        //列印主線程         NSLog(@"主線程----%@",[NSThread mainThread]);             //建立串列隊列         dispatch_queue_t  queue= dispatch_queue_create("tqh", NULL);             //2.新增工作到隊列中執行        dispatch_sync(queue, ^{                NSLog(@"下載圖片1----%@",[NSThread currentThread]);            });        dispatch_sync(queue, ^{                 NSLog(@"下載圖片2----%@",[NSThread currentThread]);             });        dispatch_sync(queue, ^{            NSLog(@"下載圖片3----%@",[NSThread currentThread]);             });}
/** 補充:隊列名稱的作用:  將來調試的時候,可以看得出任務是在哪個隊列中執行的。  說明:同步函數不具備開啟線程的能力,無論是什麼隊列都不會開啟線程;非同步函數具備開啟線程的能力,開啟幾條線程由隊列決定(串列隊列只會開啟一條新的線程,並發隊列會開啟多條線程)。  同步函數  (1)並發隊列:不會開線程  (2)串列隊列:不會開線程  非同步函數  (1)並發隊列:能開啟N條線程  (2)串列隊列:開啟1條線程  補充: 凡是函數中,各種函數名中帶有create\copy\new\retain等字眼,都需要在不需要使用這個資料的時候進行release。  GCD的資料類型在ARC的環境下不需要再做release。  CF(core Foundation)的資料類型在ARC環境下還是需要做release。  非同步函數具備開線程的能力,但不一定會開線程  */

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.