iOS中多線程_06_GCD其它用法

來源:互聯網
上載者:User

標籤:style   blog   color   os   使用   io   strong   檔案   for   

一、延時執行1、iOS常見的延時執行有2種方式

  (1)調用NSObject的方法

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

  (2)使用GCD函數

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

  注意:這裡非同步執行的代碼,是放在主隊列中執行的 

2、GCD延時執行

  (1)主隊列執行

1     NSLog(@"延時開始前....");2     // 輸入dispatch_after3     // 從目前時間,延遲2.0秒之後,給主隊列添加一個任務(此任務會在主線程上【非同步】運行)4     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{5         NSLog(@"%@", [NSThread currentThread]);6     });7     NSLog(@"延時設定結束....");

  輸出結果:

  延時開始前....

  延時設定結束....

  <NSThread: 0x8d53ea0>{name = (null), num = 1}

   從結果看出,延時操作是在主隊列非同步啟動並執行,因為 dispatch_after 裡邊有個 dispatch_get_main_queue參數

  (2)非同步任務,開啟子線程執行延時

 1     // 1. 隊列 2     dispatch_queue_t q = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT); 3      4     // 2. 非同步任務 5     dispatch_async(q, ^{ 6         NSLog(@"延時開始前.... %@", [NSThread currentThread]); 7         // 輸入dispatch_after 8         // 從目前時間,延遲2.0秒之後,給主隊列添加一個任務(此任務會在主線程上【非同步】運行) 9         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{10             NSLog(@"%@", [NSThread currentThread]);11         });12         NSLog(@"延時設定結束....");13     });

 

  輸出結果:

  延時開始前.... <NSThread: 0x8c3f870>{name = (null), num = 2}

  延時設定結束....

  <NSThread: 0x8c23a80>{name = (null), num = 1}

  結果說明,延時操作回到了主線程執行

  (3)延時操作預設在主隊列執行的優點:

  調用的方法通常是跟UI有關的,例如提示使用者等;

  不瞭解GCD或者多線程的人,可以直接填空即可。

  (4)dispatch_after 延時操作應用情境

  例如:遊戲後台需要做一些隨機的事件,需要在某個時間後,調用方法。

  一會兒冒個花,冒個什麼的,無意間做了什麼操作之後

二、隊列組  (1)有這麼1種需求  首先:分別非同步執行2個耗時的操作  其次:等2個非同步作業都執行完畢後,再回到主線程執行操作  如果想要快速高效地實現上述需求,可以考慮用隊列組
dispatch_group_t group =  dispatch_group_create();dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{    // 執行1個耗時的非同步作業});dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{    // 執行1個耗時的非同步作業});dispatch_group_notify(group, dispatch_get_main_queue(), ^{    // 等前面的非同步作業都執行完畢後,回到主線程...});

  (2)現執行個體子

  類比下載txt檔案

iOS中多線程_06_GCD其它用法

聯繫我們

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