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

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

iOS-GCD詳解及簡單使用

2019-10-21 18:51:03
字體:
供稿:網(wǎng)友

iOS-GCD 介紹

在開發(fā)過程中,我們有時(shí)會希望把一些操作封裝起來延遲一段時(shí)間后再執(zhí)行。iOS開發(fā)中,有兩種常用的方法可以實(shí)現(xiàn)延遲執(zhí)行,一種是使用GCD,另外一種是使用NSRunLoop類中提供的方法。

前言

對初學(xué)者來說,GCD似乎是一道邁不過去的坎,很多人在同步、異步、串行、并行和死鎖這幾個(gè)名詞的漩渦中漸漸放棄治療。本文將使用圖文表并茂的方式給大家形象地解釋其中的原理和規(guī)律。

線程、任務(wù)和隊(duì)列的概念

iOS-GCD使用詳解,iOS-GCD,整理資料,實(shí)例及詳細(xì)介紹

異步、同步 & 并行、串行的特點(diǎn)

iOS-GCD使用詳解,iOS-GCD,整理資料,實(shí)例及詳細(xì)介紹

一條重要的準(zhǔn)則

一般來說,我們使用GCD的最大目的是在新的線程中同時(shí)執(zhí)行多個(gè)任務(wù),這意味著我們需要兩項(xiàng)條件:

  1. 能開啟新的線程
  2. 任務(wù)可以同時(shí)執(zhí)行
  3. 結(jié)合以上兩個(gè)條件,也就等價(jià)“開啟新線程的能力 + 任務(wù)同步執(zhí)行的權(quán)利”,只有在滿足能力與權(quán)利這兩個(gè)條件的前提下,我們才可以在同時(shí)執(zhí)行多個(gè)任務(wù)。

 所有組合的特點(diǎn)

iOS-GCD使用詳解,iOS-GCD,整理資料,實(shí)例及詳細(xì)介紹

(一)異步執(zhí)行 + 并行隊(duì)列

實(shí)現(xiàn)代碼:

//異步執(zhí)行 + 并行隊(duì)列- (void)asyncConcurrent{  //創(chuàng)建一個(gè)并行隊(duì)列  dispatch_queue_t queue = dispatch_queue_create("標(biāo)識符", DISPATCH_QUEUE_CONCURRENT);   NSLog(@"---start---");   //使用異步函數(shù)封裝三個(gè)任務(wù)  dispatch_async(queue, ^{    NSLog(@"任務(wù)1---%@", [NSThread currentThread]);  });  dispatch_async(queue, ^{    NSLog(@"任務(wù)2---%@", [NSThread currentThread]);  });  dispatch_async(queue, ^{    NSLog(@"任務(wù)3---%@", [NSThread currentThread]);  });   NSLog(@"---end---");}

打印結(jié)果:

---start---

  ---end---

  任務(wù)3---{number = 5, name = (null)}

  任務(wù)2---{number = 4, name = (null)}

  任務(wù)1---{number = 3, name = (null)}

解釋:

1.異步執(zhí)行意味著

可以開啟新的線程

任務(wù)可以先繞過不執(zhí)行,回頭再來執(zhí)行

2.并行隊(duì)列意味著

任務(wù)之間不需要排隊(duì),且具有同時(shí)被執(zhí)行的“權(quán)利”

3.兩者組合后的結(jié)果

開了三個(gè)新線程

函數(shù)在執(zhí)行時(shí),先打印了start和end,再回頭執(zhí)行這三個(gè)任務(wù)

這三個(gè)任務(wù)是同時(shí)執(zhí)行的,沒有先后,所以打印結(jié)果是“任務(wù)3-->任務(wù)2-->任務(wù)1”

步驟圖

iOS-GCD使用詳解,iOS-GCD,整理資料,實(shí)例及詳細(xì)介紹

(二)異步執(zhí)行 + 串行隊(duì)列

實(shí)現(xiàn)代碼:

//異步執(zhí)行 + 串行隊(duì)列- (void)asyncSerial{  //創(chuàng)建一個(gè)串行隊(duì)列  dispatch_queue_t queue = dispatch_queue_create("標(biāo)識符", DISPATCH_QUEUE_SERIAL);   NSLog(@"---start---");  //使用異步函數(shù)封裝三個(gè)任務(wù)  dispatch_async(queue, ^{    NSLog(@"任務(wù)1---%@", [NSThread currentThread]);  });  dispatch_async(queue, ^{    NSLog(@"任務(wù)2---%@", [NSThread currentThread]);  });  dispatch_async(queue, ^{    NSLog(@"任務(wù)3---%@", [NSThread currentThread]);  });  NSLog(@"---end---");}

打印結(jié)果:

 ---start---

 ---end---

任務(wù)1---{number = 3, name = (null)}

任務(wù)2---{number = 3, name = (null)}

任務(wù)3---{number = 3, name = (null)}

解釋:

異步執(zhí)行意味著

可以開啟新的線程

任務(wù)可以先繞過不執(zhí)行,回頭再來執(zhí)行

串行隊(duì)列意味著

任務(wù)必須按添加進(jìn)隊(duì)列的順序挨個(gè)執(zhí)行

兩者組合后的結(jié)果

開了一個(gè)新的子線程

函數(shù)在執(zhí)行時(shí),先打印了start和end,再回頭執(zhí)行這三個(gè)任務(wù)

這三個(gè)任務(wù)是按順序執(zhí)行的,所以打印結(jié)果是“任務(wù)1-->任務(wù)2-->任務(wù)3”

步驟圖

iOS-GCD使用詳解,iOS-GCD,整理資料,實(shí)例及詳細(xì)介紹

(三)同步執(zhí)行 + 并行隊(duì)列

實(shí)現(xiàn)代碼:

//同步執(zhí)行 + 并行隊(duì)列- (void)syncConcurrent{  //創(chuàng)建一個(gè)并行隊(duì)列  dispatch_queue_t queue = dispatch_queue_create("標(biāo)識符", DISPATCH_QUEUE_CONCURRENT);   NSLog(@"---start---");  //使用同步函數(shù)封裝三個(gè)任務(wù)  dispatch_sync(queue, ^{    NSLog(@"任務(wù)1---%@", [NSThread currentThread]);  });  dispatch_sync(queue, ^{    NSLog(@"任務(wù)2---%@", [NSThread currentThread]);  });  dispatch_sync(queue, ^{    NSLog(@"任務(wù)3---%@", [NSThread currentThread]);  });  NSLog(@"---end---");}

打印結(jié)果:

---start---

  任務(wù)1---{number = 1, name = main}

  任務(wù)2---{number = 1, name = main}

  任務(wù)3---{number = 1, name = main}

  ---end---

解釋:

同步執(zhí)行執(zhí)行意味著

不能開啟新的線程

任務(wù)創(chuàng)建后必須執(zhí)行完才能往下走

并行隊(duì)列意味著

任務(wù)必須按添加進(jìn)隊(duì)列的順序挨個(gè)執(zhí)行

兩者組合后的結(jié)果

所有任務(wù)都只能在主線程中執(zhí)行

函數(shù)在執(zhí)行時(shí),必須按照代碼的書寫順序一行一行地執(zhí)行完才能繼續(xù)

注意事項(xiàng)

在這里即便是并行隊(duì)列,任務(wù)可以同時(shí)執(zhí)行,但是由于只存在一個(gè)主線程,所以沒法把任務(wù)分發(fā)到不同的線程去同步處理,其結(jié)果就是只能在主線程里按順序挨個(gè)挨個(gè)執(zhí)行了

步驟圖

iOS-GCD使用詳解,iOS-GCD,整理資料,實(shí)例及詳細(xì)介紹

(四)同步執(zhí)行+ 串行隊(duì)列

實(shí)現(xiàn)代碼:

- (void)syncSerial{  //創(chuàng)建一個(gè)串行隊(duì)列  dispatch_queue_t queue = dispatch_queue_create("標(biāo)識符", DISPATCH_QUEUE_SERIAL);   NSLog(@"---start---");  //使用異步函數(shù)封裝三個(gè)任務(wù)  dispatch_sync(queue, ^{    NSLog(@"任務(wù)1---%@", [NSThread currentThread]);  });  dispatch_sync(queue, ^{    NSLog(@"任務(wù)2---%@", [NSThread currentThread]);  });  dispatch_sync(queue, ^{    NSLog(@"任務(wù)3---%@", [NSThread currentThread]);  });  NSLog(@"---end---");}

打印結(jié)果:

  ---start---

  任務(wù)1---{number = 1, name = main}

  任務(wù)2---{number = 1, name = main}

  任務(wù)3---{number = 1, name = main}

  ---end---

解釋:

這里的執(zhí)行原理和步驟圖跟“同步執(zhí)行+并發(fā)隊(duì)列”是一樣的,只要是同步執(zhí)行就沒法開啟新的線程,所以多個(gè)任務(wù)之間也一樣只能按順序來執(zhí)行,

(五)異步執(zhí)行+主隊(duì)列

實(shí)現(xiàn)代碼:

- (void)asyncMain{  //獲取主隊(duì)列  dispatch_queue_t queue = dispatch_get_main_queue();   NSLog(@"---start---");  //使用異步函數(shù)封裝三個(gè)任務(wù)  dispatch_async(queue, ^{    NSLog(@"任務(wù)1---%@", [NSThread currentThread]);  });  dispatch_async(queue, ^{    NSLog(@"任務(wù)2---%@", [NSThread currentThread]);  });  dispatch_async(queue, ^{    NSLog(@"任務(wù)3---%@", [NSThread currentThread]);  });  NSLog(@"---end---");}

打印結(jié)果:

  ---start---

  ---end---

  任務(wù)1---{number = 1, name = main}

  任務(wù)2---{number = 1, name = main}

  任務(wù)3---{number = 1, name = main}

解釋

異步執(zhí)行意味著

可以開啟新的線程

任務(wù)可以先繞過不執(zhí)行,回頭再來執(zhí)行

主隊(duì)列跟串行隊(duì)列的區(qū)別

隊(duì)列中的任務(wù)一樣要按順序執(zhí)行

主隊(duì)列中的任務(wù)必須在主線程中執(zhí)行,不允許在子線程中執(zhí)行

以上條件組合后得出結(jié)果:

所有任務(wù)都可以先跳過,之后再來“按順序”執(zhí)行

步驟圖

iOS-GCD使用詳解,iOS-GCD,整理資料,實(shí)例及詳細(xì)介紹

(六)同步執(zhí)行+主隊(duì)列(死鎖)

實(shí)現(xiàn)代碼:

- (void)syncMain{  //獲取主隊(duì)列  dispatch_queue_t queue = dispatch_get_main_queue();   NSLog(@"---start---");  //使用同步函數(shù)封裝三個(gè)任務(wù)  dispatch_sync(queue, ^{    NSLog(@"任務(wù)1---%@", [NSThread currentThread]);  });  dispatch_sync(queue, ^{    NSLog(@"任務(wù)2---%@", [NSThread currentThread]);  });  dispatch_sync(queue, ^{    NSLog(@"任務(wù)3---%@", [NSThread currentThread]);  });  NSLog(@"---end---");}

打印結(jié)果:

  ---start---

 

 

解釋

  1. 主隊(duì)列中的任務(wù)必須按順序挨個(gè)執(zhí)行
  2. 任務(wù)1要等主線程有空的時(shí)候(即主隊(duì)列中的所有任務(wù)執(zhí)行完)才能執(zhí)行
  3. 主線程要執(zhí)行完“打印end”的任務(wù)后才有空
  4. “任務(wù)1”和“打印end”兩個(gè)任務(wù)互相等待,造成死鎖

步驟圖

iOS-GCD使用詳解,iOS-GCD,整理資料,實(shí)例及詳細(xì)介紹

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關(guān)教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 彝良县| 南昌市| 新乡县| 宁安市| 阿克陶县| 水城县| 涟水县| 东宁县| 平邑县| 长沙市| 奉新县| 阿瓦提县| 新安县| 沙湾县| 大渡口区| 砚山县| 三门峡市| 石阡县| 诸暨市| 都兰县| 宁波市| 房山区| 定襄县| 老河口市| 澎湖县| 永嘉县| 宜丰县| 临湘市| 甘孜县| 团风县| 东台市| 宝鸡市| 监利县| 绍兴县| 和静县| 桂阳县| 康定县| 鹤岗市| 甘谷县| 万州区| 五寨县|