1. 程式人生 > >iOS-GCD多執行緒程式設計4

iOS-GCD多執行緒程式設計4

                     iOS-GCD多執行緒程式設計詳解4

今天主要討論的是dispatch_group_t及其它的使用。

一.dispatch_qroup_t

dispatch_group_t就是提交的任務的一個集合,非同步呼叫的block集合。

建立dispatch_qroup_t group = dispatch_group_create();這樣就建立了一個組。

怎麼向group中新增block任務了。

 dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"block1");
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"block2");
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"block3");
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"block4");
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"block5");
    });
執行結果:

1:

2015-01-09 23:17:52.833 GCDTest[699:32388] block2

2015-01-09 23:17:52.834 GCDTest[699:32411] block5

2015-01-09 23:17:52.833 GCDTest[699:32389] block3

2015-01-09 23:17:52.833 GCDTest[699:32387] block1

2015-01-09 23:17:52.833 GCDTest[699:32410] block4

2:

2015-01-09 23:19:26.610 GCDTest[706:33157] block1

2015-01-09 23:19:26.610 GCDTest[706:33155] block2

2015-01-09 23:19:26.610 GCDTest[706:33156] block3

2015-01-09 23:19:26.610 GCDTest[706:33158] block4

2015-01-09 23:19:26.610 GCDTest[706:33161] block5

3:

2015-01-09 23:19:53.354 GCDTest[711:33486] block1

2015-01-09 23:19:53.355 GCDTest[711:33492] block5

2015-01-09 23:19:53.354 GCDTest[711:33487] block2

2015-01-09 23:19:53.354 GCDTest[711:33489] block3

2015-01-09 23:19:53.354 GCDTest[711:33488] block4

加入到group中的任務是非同步併發執行。佇列為dispatch_get_global_queue(0, 0)。

把group放到主佇列中會怎樣了:

dispatch_group_async(group, dispatch_get_main_queue(), ^{
        NSLog(@"block1");
    });
    
    dispatch_group_async(group, dispatch_get_main_queue(), ^{
        NSLog(@"block2");
    });
    
    dispatch_group_async(group, dispatch_get_main_queue(), ^{
        NSLog(@"block3");
    });
    
    dispatch_group_async(group, dispatch_get_main_queue(), ^{
        NSLog(@"block4");
    });
    
    dispatch_group_async(group, dispatch_get_main_queue(), ^{
        NSLog(@"block5");
    });
執行結果:一直不變

2015-01-09 23:21:55.289 GCDTest[735:34297] block1

2015-01-09 23:21:55.291 GCDTest[735:34297] block2

2015-01-09 23:21:55.291 GCDTest[735:34297] block3

2015-01-09 23:21:55.291 GCDTest[735:34297] block4

2015-01-09 23:21:55.291 GCDTest[735:34297] block5

順序非同步執行。

通過加入到不同佇列可以看出group就是邏輯上把block任務分組而已。它的執行順序還是與它被加入到什麼佇列中有關。

二.dispatch_group_enter與dispatch_group_leave的使用

這兩個函式總是成對出現的,有進入就有出,如果你要新增很多個block,你是手動一個一個的去呼叫dispatch_group_async還是通過一個迴圈加入,這兩個函式就是提供這樣的功能。

dispatch_group_t group = dispatch_group_create();
    
    dispatch_queue_t queue = dispatch_queue_create("", DISPATCH_QUEUE_CONCURRENT);
    
    for (int i=0; i<5; i++) {
        dispatch_group_enter(group);
        dispatch_async(queue, ^{
            
            NSLog(@"group 1 --block --%d",i);
            dispatch_group_leave(group);
    
        });
        
    }

執行結果:

2015-01-09 23:42:11.962 GCDTest[1011:42026] group 1 --block --1

2015-01-09 23:42:11.962 GCDTest[1011:42030] group 1 --block --3

2015-01-09 23:42:11.962 GCDTest[1011:42025] group 1 --block --2

2015-01-09 23:42:11.962 GCDTest[1011:42027] group 1 --block --0

2015-01-09 23:42:11.962 GCDTest[1011:42031] group 1 --block --4

執行效果也是非同步併發執行的。


dispatch_group_t與dispatch_barrier_async的聯合使用:
 dispatch_group_t group = dispatch_group_create();
    
    dispatch_queue_t queue = dispatch_queue_create("", DISPATCH_QUEUE_CONCURRENT);
    
    for (int i=0; i<5; i++) {
        dispatch_group_enter(group);
        dispatch_async(queue, ^{
            
            NSLog(@"group 1 --block --%d",i);
            dispatch_group_leave(group);
    
        });
        
    }
    
    dispatch_barrier_async(queue, ^{
        NSLog(@"barrier block");
    });
    
    dispatch_group_t group2 = dispatch_group_create();
    
    for (int i=0; i<5; i++) {
        dispatch_group_enter(group2);
        dispatch_async(queue, ^{
            
            NSLog(@"group 2 --block --%d",i);
            dispatch_group_leave(group2);
            
        });
        
    }

執行效果:

1:

2015-01-09 23:44:01.434 GCDTest[1029:42724] group 1 --block --2

2015-01-09 23:44:01.434 GCDTest[1029:42723] group 1 --block --1

2015-01-09 23:44:01.434 GCDTest[1029:42722] group 1 --block --0

2015-01-09 23:44:01.435 GCDTest[1029:42729] group 1 --block --3

2015-01-09 23:44:01.435 GCDTest[1029:42730] group 1 --block --4

2015-01-09 23:44:01.435 GCDTest[1029:42730] barrier block

2015-01-09 23:44:01.436 GCDTest[1029:42730] group 2 --block --0

2015-01-09 23:44:01.436 GCDTest[1029:42729] group 2 --block --2

2015-01-09 23:44:01.436 GCDTest[1029:42729] group 2 --block --3

2015-01-09 23:44:01.436 GCDTest[1029:42729] group 2 --block --4

2015-01-09 23:44:01.436 GCDTest[1029:42730] group 2 --block --1

2.

2015-01-09 23:46:23.936 GCDTest[1040:43990] group 1 --block --0

2015-01-09 23:46:23.936 GCDTest[1040:43993] group 1 --block --1

2015-01-09 23:46:23.936 GCDTest[1040:43992] group 1 --block --2

2015-01-09 23:46:23.936 GCDTest[1040:43991] group 1 --block --3

2015-01-09 23:46:23.937 GCDTest[1040:43997] group 1 --block --4

2015-01-09 23:46:23.939 GCDTest[1040:43997] barrier block

2015-01-09 23:46:23.939 GCDTest[1040:43997] group 2 --block --0

2015-01-09 23:46:23.939 GCDTest[1040:43991] group 2 --block --1

2015-01-09 23:46:23.939 GCDTest[1040:43997] group 2 --block --2

2015-01-09 23:46:23.939 GCDTest[1040:43991] group 2 --block --3

2015-01-09 23:46:23.939 GCDTest[1040:43997] group 2 --block --4

3:

2015-01-09 23:46:51.977 GCDTest[1059:44419] group 1 --block --3

2015-01-09 23:46:51.976 GCDTest[1059:44420] group 1 --block --0

2015-01-09 23:46:51.977 GCDTest[1059:44426] group 1 --block --4

2015-01-09 23:46:51.977 GCDTest[1059:44421] group 1 --block --2

2015-01-09 23:46:51.976 GCDTest[1059:44418] group 1 --block --1

2015-01-09 23:46:51.978 GCDTest[1059:44418] barrier block

2015-01-09 23:46:51.978 GCDTest[1059:44421] group 2 --block --1

2015-01-09 23:46:51.978 GCDTest[1059:44421] group 2 --block --2

2015-01-09 23:46:51.978 GCDTest[1059:44418] group 2 --block --0

2015-01-09 23:46:51.978 GCDTest[1059:44421] group 2 --block --3

2015-01-09 23:46:51.979 GCDTest[1059:44418] group 2 --block --4

從執行結果來看,dispatch_barrier_async對group也是起到作用的,從而可以建立group之間的執行先後及其依賴關係。

dispatch_group_notify的使用

dispatch_group_t group = dispatch_group_create();
    
    dispatch_queue_t queue = dispatch_queue_create("", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"block1");
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"block2");
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"block3");
    });
    
    dispatch_group_notify(group, queue, ^{
        NSLog(@"我是所有block執行完之後才執行的");
    });

執行結果:

1:

2015-01-10 00:03:09.250 GCDTest[1285:51528] block3

2015-01-10 00:03:09.250 GCDTest[1285:51527] block2

2015-01-10 00:03:09.250 GCDTest[1285:51525] block1

2015-01-10 00:03:09.251 GCDTest[1285:51525]我是所有block執行完之後才執行的

2:

2015-01-10 00:04:41.431 GCDTest[1295:52381] block1

2015-01-10 00:04:41.431 GCDTest[1295:52379] block2

2015-01-10 00:04:41.431 GCDTest[1295:52380] block3

2015-01-10 00:04:41.432 GCDTest[1295:52380]我是所有block執行完之後才執行的


3:

2015-01-10 00:04:56.925 GCDTest[1300:52561] block1

2015-01-10 00:04:56.925 GCDTest[1300:52560] block3

2015-01-10 00:04:56.925 GCDTest[1300:52562] block2

2015-01-10 00:04:56.926 GCDTest[1300:52562]我是所有block執行完之後才執行的


該函式可用在當多工更新資料完成之後通知UI更改介面。

今天就講到學到著,下一張繼續GCD的內容。




相關推薦

iOS-GCD執行程式設計4

                     iOS-GCD多執行緒程式設計詳解4 今天主要討論的是dispatch_group_t及其它的使用。 一.dispatch_qroup_t dispatch_group_t就是提交的任務的一個集合,非同步呼叫的block集合

iOSGCD執行程式設計詳解1

文明看博轉載是對自己的尊重也是對學者的鼓勵,歡迎討論 iOS-GCD多執行緒程式設計詳解 一.前言 前面的多執行緒程式設計中分別講到NSThread和NSOperation的多執行緒程式設計,本張主要是講述GCD的程式設計,GCD的多執行緒程式設計是基於BLock或者函式

iOS GCD 執行非同步實踐

1、GCD執行非同步序列佇列不能保證100%的順序執行; 2、不要頻繁的讀寫磁碟,放到子執行緒裡也會極大的影響效能和耗電; 3、使用SDWebimage為cell.imageView賦值URL的時候不能使用非同步執行緒,因為非同步沒辦法控制SD裡image的返回順序,也涉

iOS-GCD執行

1、GCD基本知識 學習 GCD 之前,先來了解 GCD 中兩個核心概念:任務和佇列。 任務:當前執行的操作,換句話說就是現線上程中執行的那段程式碼,在 GCD 中是放在 block 中的。 任務的執行有兩種方式:同步執行(sync)和非同步執行(async)。兩者的主

執行程式設計4

一、簡介 在iOS所有實現多執行緒的方案中,GCD應該是最有魅力的,因為GCD本身是蘋果公司為多核的並行運算提出的解決方案。GCD在工作時會自動利用更多的處理器核心,以充分利用更強大的機器。GCD是Grand Central Dispatch的簡稱,它是基於C語言的。如果使

IOS_執行程式設計4

一、簡介 在iOS所有實現多執行緒的方案中,GCD應該是最有魅力的,因為GCD本身是蘋果公司為多核的並行運算提出的解決方案。GCD在工作時會自動利用更多的處理器核心,以充分利用更強大的機器。GCD是Grand Central Dispatch的簡稱,它是基於C語言的。如

python執行程式設計(4): 死鎖和可重入鎖

線上程間共享多個資源的時候,如果兩個執行緒分別佔有一部分資源並且同時等待對方的資源,就會造成死鎖。儘管死鎖很少發生,但一旦發生就會造成應用的停止響應。下面看一個死鎖的例子: # encoding: UTF-8import threadingimport timec

iOS GCD執行下載原理

一、任務和佇列 GCD中有2個核心概念 (1)任務:執行什麼操作 (2)佇列:用來存放任務 GCD的使用就2個步驟 (1)定製任務 (2)確定想做的事情 將任務新增到佇列中,GCD會自動將佇列中的任務取出,放到對應的執行緒中執行 提示:任務的取出遵循

iOS沉思錄】NSThread、GCD、NSOperation執行程式設計總結

OC中的多執行緒 OC中多執行緒根據封裝程度可以分為三個層次:NSThread、GCD和NSOperation,另外由於OC相容C語言,因此仍然可以使用C語言的POSIX介面來實現多執行緒,只需引入相應的標頭檔案:#include <pthrea

iOS開發-執行程式設計技術(Thread、Cocoa operations、GCD

簡介 在軟體開發中,多執行緒程式設計技術被廣泛應用,相信多執行緒任務對我們來說已經不再陌生了。有了多執行緒技術,我們可以同做多個事情,而不是一個一個任務地進行。比如:前端和後臺作互動、大任務(需要耗費一定的時間和資源)等等。也就是說,我們可以使用執行緒把佔據時間長的任務放到後臺中處理,而不影響到使用者的使用

iOS執行程式設計之Grand Central Dispatch(GCD)介紹和使用

介紹: Grand Central Dispatch 簡稱(GCD)是蘋果公司開發的技術,以優化的應用程式支援多核心處理器和其他的對稱多處理系統的系統。這建立在任務並行執行的執行緒池模式的基礎上的。它首次釋出在Mac OS X 10.6 ,iOS 4及以上也可用。 設計:

iOS-執行程式設計學習之GCD——序列佇列和併發佇列(五)

  Grand Central Dispatch(GCD)有很多部分構成,例如有很好的語言特性,執行庫,還提供了系統的、高效的方式來支援具有多核處理器的iOS和OS X裝置進行併發事件處理。   BSD子系統,CoreFoundation和Cocoa APIs

iOS執行程式設計(四)------ GCD(Grand Central Dispatch)

一、簡介 是基於C語言開發的一套多執行緒開發機制,也是目前蘋果官方推薦的多執行緒開發方法,用起來也最簡單,只是它基於C語言開發,並不像NSOperation是面向物件的開發,而是完全面向過程的。如果使用GCD,完全由系統管理執行緒,我們不需要編

iOS執行程式設計技術NSThread、Cocoa NSOperation、GCD三者使用詳解

簡介 iOS有三種多執行緒程式設計的技術,分別是:(一)NSThread (二)Cocoa NSOperation (三)GCD(全稱:Grand Central Dispatch)三種方式的優缺點介紹: 1)NSThread優點:NSThread 比其他兩個輕量級缺點

iOS總結-執行篇之GCD之三

dispatch_barrier_async :GCD柵欄方法 dispatch_apply dispatch_semaphore:GCD訊號量 持有計數的訊號,計數為0時等待,不可通過.計數為1或者大於1時,計數減1且不等待,可通過. dispatch_semap

iOS總結-執行篇之GCD之二

dispatch_group dispatch_wait dispatch_group_enter/dispatch_group_leave dispatch_group_enter標誌一個任務加入group,未執行完畢任務數+1  dispatch_group

iOS總結-執行篇之GCD之一

程序:作業系統資源分配的基本單位   執行緒:任務排程和執行的基本單位 一個程序裡面可以有多個執行緒. GCD自動利用CPU核心(如雙核,四核),會自動管理執行緒的生命週期(建立執行緒,排程任務,銷燬執行緒) 而NSOperation Queue是可以管理執行緒的. 佇列

執行程式設計-002-GCD

p.p1 { margin: 0.0px 0.0px 0.0px 18.0px; text-indent: -18.0px; font: 14.0px "Yuanti SC"; color: #000000 }   ①什麼是GCD   p.p1 { margin: 0.0px 0.

iOS開發執行學習總結 - GCD的使用

文章內容和排版參考: iOS 多執行緒: [GCD]詳盡總結 GCD - 核心概念:  任務 | 佇列 任務: 就是指需要執行的程式碼, 在block中編寫,有 同步執行 和 非同步執行 兩種方式. 

《Java執行程式設計實戰》——第4章 Guarded Suspension(保護性暫掛)模式

一個執行緒等待另一個執行緒完成一定的操作,才能繼續執行。 核心思想是如果某個執行緒執行特定的操作前需要滿足一定的條件,則在該條件未滿足時將該執行緒暫停執行(waiting)。 類圖 如果頻繁出現保護方法被呼叫時保護條件不成立,那麼保護方法的執行執行緒就會頻繁地被暫掛和喚醒,而導致頻繁