標籤:
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的幾種常用常用的方法