欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS應(yīng)用程序中通過dispatch隊(duì)列控制線程執(zhí)行的方法

 更新時(shí)間:2016年05月12日 09:16:24   作者:李剛  
Grand Central Dispatch簡稱(GCD)是蘋果公司開發(fā)的技術(shù),以優(yōu)化的應(yīng)用程序支持多核心處理器和其他的對稱多處理系統(tǒng)的系統(tǒng),iOS應(yīng)用程序中通過dispatch隊(duì)列控制線程執(zhí)行則是以并發(fā)來達(dá)到多核優(yōu)化的重要途徑.

GCD編程的核心就是dispatch隊(duì)列,dispatch block的執(zhí)行最終都會放進(jìn)某個(gè)隊(duì)列中去進(jìn)行,它類似NSOperationQueue但更復(fù)雜也更強(qiáng)大,并且可以嵌套使用。所以說,結(jié)合block實(shí)現(xiàn)的GCD,把函數(shù)閉包(Closure)的特性發(fā)揮得淋漓盡致。

dispatch隊(duì)列的生成可以有這幾種方式:

1. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_SERIAL); //生成一個(gè)串行隊(duì)列,隊(duì)列中的block按照先進(jìn)先出(FIFO)的順序去執(zhí)行,實(shí)際上為單線程執(zhí)行。第一個(gè)參數(shù)是隊(duì)列的名稱,在調(diào)試程序時(shí)會非常有用,所有盡量不要重名了。

2. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent", DISPATCH_QUEUE_CONCURRENT); //生成一個(gè)并發(fā)執(zhí)行隊(duì)列,block被分發(fā)到多個(gè)線程去執(zhí)行

3. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //獲得程序進(jìn)程缺省產(chǎn)生的并發(fā)隊(duì)列,可設(shè)定優(yōu)先級來選擇高、中、低三個(gè)優(yōu)先級隊(duì)列。由于是系統(tǒng)默認(rèn)生成的,所以無法調(diào)用dispatch_resume()和dispatch_suspend()來控制執(zhí)行繼續(xù)或中斷。需要注意的是,三個(gè)隊(duì)列不代表三個(gè)線程,可能會有更多的線程。并發(fā)隊(duì)列可以根據(jù)實(shí)際情況來自動產(chǎn)生合理的線程數(shù),也可理解為dispatch隊(duì)列實(shí)現(xiàn)了一個(gè)線程池的管理,對于程序邏輯是透明的。

官網(wǎng)文檔解釋說共有三個(gè)并發(fā)隊(duì)列,但實(shí)際還有一個(gè)更低優(yōu)先級的隊(duì)列,設(shè)置優(yōu)先級為DISPATCH_QUEUE_PRIORITY_BACKGROUND。Xcode調(diào)試時(shí)可以觀察到正在使用的各個(gè)dispatch隊(duì)列。

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

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

復(fù)制代碼 代碼如下:

 //  后臺執(zhí)行:
 dispatch_async(dispatch_get_global_queue(0, 0), ^{
      // something
 });

復(fù)制代碼 代碼如下:

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

復(fù)制代碼 代碼如下:

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

復(fù)制代碼 代碼如下:

 // 延遲2秒執(zhí)行:
 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方法,示例如下:
復(fù)制代碼 代碼如下:

 // 自定義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還有一些高級用法,例如讓后臺兩個(gè)線程并行執(zhí)行,然后等兩個(gè)線程都結(jié)束后,再匯總執(zhí)行結(jié)果。這個(gè)可以用dispatch_group_t、dispatch_group_async、dispatch_group_notify來實(shí)現(xiàn),示例如下:
復(fù)制代碼 代碼如下:

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

dispatch隊(duì)列不支持cancel(取消),沒有實(shí)現(xiàn)dispatch_cancel()函數(shù),不像NSOperationQueue,不得不說這是個(gè)小小的缺憾。

相關(guān)文章

  • iOS從系統(tǒng)相冊選取多張照片示例代碼

    iOS從系統(tǒng)相冊選取多張照片示例代碼

    本篇文章主要介紹了iOS從系統(tǒng)相冊選取多張照片示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • iOS 報(bào)clang: error: no input files錯(cuò)誤的解決方法

    iOS 報(bào)clang: error: no input files錯(cuò)誤的解決方法

    這篇文章主要給大家介紹了關(guān)于iOS報(bào)clang: error: no input files錯(cuò)誤的解決方法,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • iOS實(shí)現(xiàn)小型計(jì)算器

    iOS實(shí)現(xiàn)小型計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)小型計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • iOS開發(fā)實(shí)現(xiàn)搜索框(UISearchController)

    iOS開發(fā)實(shí)現(xiàn)搜索框(UISearchController)

    這篇文章主要為大家詳細(xì)介紹了iOS開發(fā)實(shí)現(xiàn)搜索框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • iOS應(yīng)用開發(fā)中AFNetworking庫的常用HTTP操作方法小結(jié)

    iOS應(yīng)用開發(fā)中AFNetworking庫的常用HTTP操作方法小結(jié)

    AFNetworking庫是Objective-C語言寫成的用于處理HTTP的第三方庫,在GitHub上開源并且一直在被更新和維護(hù),下面就一起來看一下iOS應(yīng)用開發(fā)中AFNetworking庫的常用HTTP操作方法小結(jié)
    2016-05-05
  • iOS利用AVPlayer播放網(wǎng)絡(luò)音樂的方法教程

    iOS利用AVPlayer播放網(wǎng)絡(luò)音樂的方法教程

    最近工作中遇到了一個(gè)需求,需要做一個(gè)在線音樂類的APP,通過一段時(shí)間的努力實(shí)現(xiàn)了,所以這篇文章主要給大家介紹了關(guān)于iOS利用AVPlayer播放網(wǎng)絡(luò)音樂的方法教程,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • iOS 圖片上傳使用base64或者二進(jìn)制流上傳頭像功能

    iOS 圖片上傳使用base64或者二進(jìn)制流上傳頭像功能

    這篇文章主要介紹了iOS 圖片上傳使用base64或者二進(jìn)制流上傳頭像功能,需要的朋友可以參考下
    2017-09-09
  • iOS 圖片旋轉(zhuǎn)方法實(shí)例代碼

    iOS 圖片旋轉(zhuǎn)方法實(shí)例代碼

    這篇文章主要介紹了iOS 圖片旋轉(zhuǎn)方法實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • 詳解IOS點(diǎn)擊空白處隱藏鍵盤的幾種方法介紹

    詳解IOS點(diǎn)擊空白處隱藏鍵盤的幾種方法介紹

    本篇文章主要介紹了IOS點(diǎn)擊空白處隱藏鍵盤的幾種方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-12-12
  • iOS在狀態(tài)欄上顯示提醒信息的功能定制

    iOS在狀態(tài)欄上顯示提醒信息的功能定制

    這篇文章主要給大家介紹了iOS在狀態(tài)欄上顯示提醒信息的相關(guān)資料,實(shí)現(xiàn)后的效果非常不錯(cuò),文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。
    2017-06-06

最新評論