iOS應用程式中通過dispatch隊列控制線程執行的方法_IOS

來源:互聯網
上載者:User

GCD編程的核心就是dispatch隊列,dispatch block的執行最終都會放進某個隊列中去進行,它類似NSOperationQueue但更複雜也更強大,並且可以嵌套使用。所以說,結合block實現的GCD,把函數閉包(Closure)的特性發揮得淋漓盡致。

dispatch隊列的產生可以有這幾種方式:

1. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_SERIAL); //產生一個串列隊列,隊列中的block按照先進先出(FIFO)的順序去執行,實際上為單線程執行。第一個參數是隊列的名稱,在偵錯工具時會非常有用,所有盡量不要重名了。

2. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent", DISPATCH_QUEUE_CONCURRENT); //產生一個並發執行隊列,block被分發到多個線程去執行

3. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //獲得程式進程預設產生的並發隊列,可設定優先順序來選擇高、中、低三個優先順序隊列。由於是系統預設產生的,所以無法調用dispatch_resume()和dispatch_suspend()來控制執行繼續或中斷。需要注意的是,三個隊列不代表三個線程,可能會有更多的線程。並發隊列可以根據實際情況來自動產生合理的線程數,也可理解為dispatch隊列實現了一個線程池的管理,對於程式邏輯是透明的。

官網文檔解釋說共有三個並發隊列,但實際還有一個更低優先順序的隊列,設定優先權為DISPATCH_QUEUE_PRIORITY_BACKGROUND。Xcode調試時可以觀察到正在使用的各個dispatch隊列。

4. dispatch_queue_t queue = dispatch_get_main_queue(); //獲得主線程的dispatch隊列,實際是一個串列隊列。同樣無法控制主線程dispatch隊列的執行繼續或中斷。

線程操作樣本
為了方便地使用GCD,蘋果提供了一些方法方便我們將block放在主線程或後台線程執行,或者延後執行。使用的例子如下所示:

複製代碼 代碼如下:

 //  後台執行:
 dispatch_async(dispatch_get_global_queue(0, 0), ^{
      // something
 });

複製代碼 代碼如下:

 // 主線程執行:
 dispatch_async(dispatch_get_main_queue(), ^{
      // something
 });

複製代碼 代碼如下:

 // 一次性執行:
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
     // code to be executed once
 });

複製代碼 代碼如下:

 // 延遲2秒執行:
 double delayInSeconds = 2.0;
 dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
 dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
     // code to be executed on the main queue after delay
 });

dispatch_queue_t也可以自己定義,如要自訂queue,可以用dispatch_queue_create方法,樣本如下:
複製代碼 代碼如下:

 // 自訂dispatch_queue_t
 dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL);
 dispatch_async(urls_queue, ^{ 
   // your code
 });
 dispatch_release(urls_queue);

另外,GCD還有一些進階用法,例如讓後台兩個線程並存執行,然後等兩個線程都結束後,再匯總執行結果。這個可以用dispatch_group_t、dispatch_group_async、dispatch_group_notify來實現,樣本如下:
複製代碼 代碼如下:

 // 合并匯總結果
 dispatch_group_t group = dispatch_group_create();
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 並存執行的線程一
 });
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 並存執行的線程二
 });
 dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
      // 匯總結果
 });

dispatch隊列不支援cancel(取消),沒有實現dispatch_cancel()函數,不像NSOperationQueue,不得不說這是個小小的缺憾。

相關文章

聯繫我們

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