国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

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

2020-07-26 03:20:47
字體:
來源:轉載
供稿:網友

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

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

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

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

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

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

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

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

復制代碼 代碼如下:

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

復制代碼 代碼如下:

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

復制代碼 代碼如下:

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

復制代碼 代碼如下:

 // 延遲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方法,示例如下:
復制代碼 代碼如下:

 // 自定義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還有一些高級用法,例如讓后臺兩個線程并行執(zhí)行,然后等兩個線程都結束后,再匯總執(zhí)行結果。這個可以用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), ^{
      // 并行執(zhí)行的線程一
 });
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 并行執(zhí)行的線程二
 });
 dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
      // 匯總結果
 });

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 磴口县| 山丹县| 海兴县| 蛟河市| 封开县| 娄烦县| 洛阳市| 河北区| 武功县| 泾源县| 手游| 朝阳市| 湖南省| 湟源县| 永德县| 安阳县| 弥勒县| 胶州市| 柳州市| 永丰县| 青神县| 桦川县| 宾川县| 调兵山市| 广宁县| 永德县| 江达县| 西乌珠穆沁旗| 温宿县| 长子县| 博客| 饶河县| 朔州市| 泾川县| 浦城县| 安远县| 石渠县| 通州区| 天水市| 阜南县| 金堂县|