關於——GCD,——GCD

來源:互聯網
上載者:User

關於——GCD,——GCD
 GCD全稱是Grand Central Dispatch,可譯為“牛逼的中樞調度器”,純C語言提供了強大的函數。GCD中2個核心概念任務:執行什麼操作。隊列:用來存放任務。(說白點,任務只有放在隊列中,才能執行。) GCD的只用2個步驟定製任務: 你想要做的事情將任務添加到隊列中: GCD會自動將隊列中的任務取出,放到對應的線程中執行,任務的取出遵循隊列的FIFO原則:先進先出,後進後出。 GCD怎麼執行任務GCD中有2個用來執行任務的函數1、同步的方式執行任務

1 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);2 //queue:隊列3 //block:任務

2、非同步方式執行任務

1 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

同步和非同步區別

同步:在當前線程中執行(不會開啟線程)

非同步:在另一條線程中執行(會開啟線程)

隊列的類型

GCD的隊列可以分為2打類型

1、並發隊列

並發隊列,可以讓多個任務並發(同時)執行 (自動開啟多個線程同時執行任務)

並發功能只有在非同步(dispatch_async)函數下才有有效

GCD預設已經提供了全域的並發隊列,供整個應用使用,不需要手動建立使用dispatch_get_global_queue函數獲得全域的並發隊列
1 dispatch_queue_t dispatch_get_global_queue(2 dispatch_queue_priority_t priority, // 隊列的優先順序3 unsigned long flags); // 此參數暫時無用,用0即可4 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 獲得全域並發隊列

全域並發隊列的優先順序

1 #define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高2 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 預設(中)3 #define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低4 #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 後台

 

2、串列隊列

讓任務一個接著一個的執行 (一個任務執行完畢後,在執行下一個任務)

GCD中獲得串列有2種途徑

一、使用dispatch_queue_create函數建立串列隊列

1 dispatch_queue_t2 dispatch_queue_create(const char *label, // 隊列名稱 3 dispatch_queue_attr_t attr); // 隊列屬性,一般用NULL即可4 dispatch_queue_t queue = dispatch_queue_create("cn.itcast.queue", NULL); // 建立5 dispatch_release(queue); // 非ARC需要釋放手動建立的隊列

二、使用主隊列(跟主線程相關聯的隊列)

      主隊列是GCD內建的一種特殊的串列隊列

      放在主隊列中的任務,都會放到主線程中執行

      使用dispatch_get_main_queue()獲得主隊列

1 dispatch_queue_t queue = dispatch_get_main_queue();

 

------簡單總結下------

同步和非同步決定了要不要開啟新的線程

同步:在當前線程中執行任務,不具備開啟新的線程的能力。

非同步:在新的線程中執行任務。具備開啟新的線程的能力。

 

並發和串列決定了任務的執行方式

並發:多個任務(同時)執行

串列:一個任務執行完畢後,再執行下一個任務。

 

**線程間的通訊**

子線程返回主線程

 1     //建立全域並發隊列 2     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 3     //新增工作到隊列中,執行 4     dispatch_async(queue, ^{ 5         NSLog(@"----111----%@",[NSThread currentThread]); 6         //下載圖片 7        NSURL *url = [NSURL URLWithString:@"http://5.26923.com/download/pic/000/328/ba80a24af0d5aba07e1461eca71f9502.jpg"]; 8        NSData *data = [NSData dataWithContentsOfURL:url]; 9        UIImage *image = [UIImage imageWithData:data];10         //回主線程顯示圖片11       dispatch_async(dispatch_get_main_queue(), ^{12         NSLog(@"------22222----%@",[NSThread currentThread]) ;13         self.image1View.image = image;14                 });15     });

 

**延時執行**

一、調用NSObject的方法

1 [self performSelector:@selector(run) withObject:nil afterDelay:2.0];2 // 2秒後再調用self的run方法

二、使用GCD函數

1 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{2     // 2秒後非同步執行這裡的代碼...3     4 });

 

**一次性代碼**

使用dispatch_once函數能保證某段代碼在程式運行過程中只被執行1次

1 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{2         NSLog(@"------111------%@",[NSThread currentThread]);3     });

 

**隊列組**

隊列組適合用於,分別非同步執行2個耗時操作。且等2個非同步作業都執行完畢後,在返回主線程執行操作

 1 dispatch_group_t group =  dispatch_group_create(); 2 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 3     // 執行1個耗時的非同步作業 4 }); 5 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 6     // 執行1個耗時的非同步作業 7 }); 8 dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 9     // 等前面的非同步作業都執行完畢後,回到主線程...10 });

 

以上是,我個人學習過程中的筆記,如果您發現,不對的地方,或者有更好的方法,請告訴我。以便於我改正。萬分感謝。 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.