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

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

詳解IOS中GCD的使用

2019-10-21 18:55:57
字體:
供稿:網(wǎng)友
GCD是iOS的一種底層多線程機(jī)制,本文給大家詳細(xì)介紹IOS中GCD的使用,需要的朋友參考下吧
 

 Grand Central Dispatch(GCD)是異步執(zhí)行任務(wù)的技術(shù)之一。一般將應(yīng)用程序中記述的線程管理用的代碼在系統(tǒng)級中實(shí)現(xiàn)。開發(fā)者只需要定義想執(zhí)行的任務(wù)并追加到適當(dāng)?shù)腄ispatch Queue中,GCD就能生成必要的線程并計(jì)劃執(zhí)行任務(wù)。由于線程管理是作為系統(tǒng)的一部分來實(shí)現(xiàn)的,因此可統(tǒng)一管理,也可執(zhí)行任務(wù),這樣就比以前的線程更有效率。

1. GCD是蘋果公司為多核的并行運(yùn)算提出的解決方案

  GCD會(huì)自動(dòng)利用更多的CPU內(nèi)核(比如雙核、四核)

  GCD會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)、銷毀線程)

  程序員只需要告訴GCD想要執(zhí)行什么任務(wù),不需要編寫任何線程管理代碼

  進(jìn)程:也就是一個(gè)正在運(yùn)行的應(yīng)用程序。

  線程:進(jìn)程中的某一條完整的執(zhí)行路徑。一個(gè)進(jìn)程可以有多個(gè)線程,至少有一個(gè)線程,即主線程。在iOS開發(fā)中,所有涉及UI界面的,必須在主線程中更新。

2. GCD的工作原理:讓程序平行排隊(duì),根據(jù)可用的處理資源,安排他們在任何可用的處理器上執(zhí)行任務(wù)

3. 串行隊(duì)列,并行隊(duì)列,同步任務(wù),異步任務(wù)。 異步任務(wù)會(huì)開辟線程:異步任務(wù)在串行隊(duì)列只開啟一個(gè)子線程,異步任務(wù)在并行隊(duì)列開啟多個(gè)子線程。

//GCD 并行隊(duì)列,異步任務(wù):開啟多個(gè)線程,同時(shí)執(zhí)行。dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_async(queue, ^{for (int i =0; i<1000; i++) {NSLog(@"AAAAA %d",i);}});dispatch_async(queue, ^{for (int i =0; i<1000; i++) {NSLog(@"BBBBB %d",i);}});dispatch_async(queue, ^{for (int i =0; i<1000; i++) {NSLog(@"CCCCC %d",i);}});//串行隊(duì)列,同步任務(wù) :不開啟線程,按順序執(zhí)行dispatch_queue_t Cqueue = dispatch_queue_create("queueName", NULL);dispatch_sync(Cqueue, ^{for (int i =0; i<1000; i++) {NSLog(@"DDDDD %d",i);}});dispatch_sync(Cqueue, ^{for (int i =0; i<1000; i++) {NSLog(@"EEEEE %d",i);}});dispatch_sync(Cqueue, ^{for (int i =0; i<1000; i++) {NSLog(@"FFFFF %d",i);}});

4.我們平時(shí)使用多線程,會(huì)經(jīng)常碰到一種需求:子線程任務(wù)處理完成之后,需要主線程更新UI。我們?nèi)绾尾拍苤雷泳€程的任務(wù)都完成了。

當(dāng)我們使用串行隊(duì)列時(shí),只需將最后的回調(diào)主線程任務(wù)添加在所有任務(wù)的最后,順序執(zhí)行,便可回調(diào)。 但是當(dāng)我們使用并行隊(duì)列時(shí)候,就無法知道什么時(shí)候完成所有的子線程任務(wù),

這時(shí)候,就得用到dispatch_group了。代碼如下:

//我們同時(shí)執(zhí)行幾個(gè)異步任務(wù),他們執(zhí)行完了,我們有時(shí)候還得知道一下,,怎么辦呢,這時(shí)候,就得用到dispatch_group了,如下編代碼這樣弄,到最后執(zhí)行 dispatch_group_notify ,便可dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_group_t group = dispatch_group_create();dispatch_group_async(group, queue, ^{NSLog(@"開始執(zhí)行1");});dispatch_group_async(group, queue, ^{NSLog(@"開始執(zhí)行2");});dispatch_group_async(group, queue, ^{NSLog(@"開始執(zhí)行3");});dispatch_group_notify(group, queue, ^{NSLog(@"全部執(zhí)行完成,必須在主線程更新UI!!!");dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"主線程更新UI完成。");});});

以上內(nèi)容是小編給大家介紹的IOS中GCD的使用,希望對大家有所幫助!



注:相關(guān)教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 城固县| 南京市| 会同县| 临海市| 岳池县| 南昌县| 鹤峰县| 开远市| 铁力市| 通道| 德江县| 阿城市| 阳山县| 曲麻莱县| 镇原县| 拜泉县| 彩票| 莒南县| 肥城市| 阿坝县| 高邑县| 普兰店市| 宣武区| 游戏| 德江县| 湖北省| 阜宁县| 巴林左旗| 阿城市| 额济纳旗| 当涂县| 航空| 南昌县| 高密市| 平塘县| 镇原县| 郸城县| 高青县| 兴安盟| 布拖县| 威远县|