iOS-線程之GCD---之GCD的幾種常用常用的方法

來源:互聯網
上載者:User

標籤:

GCD中幾種常見的方法

1.代碼只被執行一次:(利用這種方式,可以簡單的建立一個單例對象)

方法dispatch_once(&,^(void){});

 1 - (void)testOne 2  3 { 4  5     static dispatch_once_t onceToken; 6  7     dispatch_once(&onceToken,^{ 8  9         NSLog(@"代碼塊只執行了一次");10 11     });12 13 }

2.在兩個線程之間執行一段代碼,並且分離了線程,不會使它們同時執行

方法:dispatch_barrier_async(queue,^(void){});

 1 - (void)testBarrier 2 { 3     //隊列不能是系統的並行隊列 4     dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT); 5     //線程一 6     dispatch_async(concurrentQueue, ^{ 7         for (int i=0; i<100; i++) { 8             NSLog(@"線程一:%d",i); 9         }10     });11     //線程二12     dispatch_async(concurrentQueue, ^{13         for (int i=0; i<100; i++) {14             NSLog(@"線程二:%d",i);15         }16     });17     //線上程一,線程二執行完成之後,線上程三執行之前執行一段代碼,再開始執行線程三18     dispatch_barrier_async(concurrentQueue, ^{19         NSLog(@"barrier");20     });21     22     //線程三23     dispatch_async(concurrentQueue, ^{24         for (int i=0; i<100; i++) {25             NSLog(@"線程三:%d",i);26         }27     });28     //線程四29     dispatch_async(concurrentQueue, ^{30         for (int i=0; i<100; i++) {31             NSLog(@"線程四:%d",i);32         }33     });34 }

3.對此執行一段代碼

方法:dispatch_apply(size_t t,queue,^(size_t times){});

block中的參數times是指當前執行的是隊列中第幾個線程,比如說:該方法要執行10次,就會在隊列中建立10個線程,並且基本同時執行,times標識的就是當前第幾個線程(所以times被列印是無序的).

 1 - (void)testApply 2 { 3     /* 4      @param1 代碼塊執行的次數 5      @param2 代碼塊所在的隊列 6      @param3 線程的執行體 7      */ 8     size_t t = 10; 9     dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);10     11     dispatch_apply(t, globalQueue, ^(size_t q){12         NSLog(@"線程一:%ld",q);13     });14 }

4.代碼在一段時間後執行

方法:dispatch_after(dispatch_time_t time,queue,^(void){});---time參數為目前時間的多少秒後去執行Block中的代碼

 1 - (void)testAffter 2 { 3     NSLog(@"執行之前"); 4     //目前時間10秒之後 5     dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 10); 6     /* 7      @param1:時間 8      @param2:線程所在的隊列 9      @param3:線程的執行體10      */11     dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{12         NSLog(@"執行了after");13     });14 }

5.GCD還提供了組的概念,可以將所有隊列(線程放在隊列中)放到組中

當組中所有隊列中的線程執行完後,將會執行dispatch_group_notify(dispatch_group_t group,queue,^(void){});方法中Block

作用:當一個頁面需要多個下載時候,就可以將該將所有非同步下載的線程添加到隊列後再添加到組中,當完成了所有的下載,最後在dispatch_group_notify方法中重新重新整理頁面.

 1 //將線程放到一個組裡面 2 - (void)testGroup 3 { 4     //建立一個組 5     dispatch_group_t group = dispatch_group_create(); 6      7     dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 8     /* 9      @param1:線程所在的組10      @param2:線程所在的隊列11      @param3:線程的執行體12      */13     dispatch_group_async(group, globalQueue, ^{14         for (int i=0; i<100; i++) {15             NSLog(@"線程一:%d",i);16         }17     });18     //在組中在添加一個線程19     dispatch_group_async(group, globalQueue, ^{20         for (int i=0; i<100; i++) {21             NSLog(@"線程二:%d",i);22         }23     });24     25     //在多有線程組裡面的所有線程執行完成之後調用的代碼26     dispatch_group_notify(group, globalQueue, ^{27         NSLog(@"線程所有的方法執行完成");28     });29 }

 

 

GCD如此強大,總有一款適合你..

iOS-線程之GCD---之GCD的幾種常用常用的方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.