1.使用GCD的dispatch_group_t
```
-(void)Btn{
????NSString?*str?=?@"http://www.reibang.com/p/6930f335adba";
????NSURL?*url?=?[NSURL?URLWithString:str];
????NSURLRequest?*request?=?[NSURLRequest?requestWithURL:url];
????NSURLSession?*session?=?[NSURLSession?sharedSession];
????dispatch_group_t?downloadGroup?=?dispatch_group_create();
????for(inti=0;?i<10;?i++)?{
????????dispatch_group_enter(downloadGroup);
????????NSURLSessionDataTask?*task?=?[session?dataTaskWithRequest:request?completionHandler:^(NSData?*?_Nullable?data,?NSURLResponse?*?_Nullable?response,?NSError?*?_Nullable?error)?{
????????????NSLog(@"%d---%d",i,i);
????????????dispatch_group_leave(downloadGroup);
????????}];
????????[task?resume];
????}
????dispatch_group_notify(downloadGroup,?dispatch_get_main_queue(),?^{
????????NSLog(@"end");
????});
}
```
2..使用GCD的信號量dispatch_semaphore_t
```
-(void)Btn{
????NSString?*str?=?@"http://www.reibang.com/p/6930f335adba";
????NSURL?*url?=?[NSURL?URLWithString:str];
????NSURLRequest?*request?=?[NSURLRequest?requestWithURL:url];
????NSURLSession?*session?=?[NSURLSession?sharedSession];
????dispatch_semaphore_t?sem?=?dispatch_semaphore_create(0);
????for(inti=0;?i<10;?i++)?{
????????NSURLSessionDataTask?*task?=?[session?dataTaskWithRequest:request?completionHandler:^(NSData?*?_Nullable?data,?NSURLResponse?*?_Nullable?response,?NSError?*?_Nullable?error)?{
????????????NSLog(@"%d---%d",i,i);
????????????count++;
????????????if(count==10)?{
????????????????dispatch_semaphore_signal(sem);
????????????????count?=?0;
????????????}
????????}];
????????[task?resume];
????}
????dispatch_semaphore_wait(sem,?DISPATCH_TIME_FOREVER);
????dispatch_async(dispatch_get_main_queue(),?^{
????????NSLog(@"end");
????});
}
```
dispatch_semaphore_t?sem?=?dispatch_semaphore_create(0);
dispatch_semaphore_signal(sem);
dispatch_semaphore_wait(sem,?DISPATCH_TIME_FOREVER);復制代碼
對這三句代碼可以這樣理解:dispatch_semaphore信號量為基于計數(shù)器的一種多線程同步機制篓吁。如果semaphore計數(shù)大于等于1,計數(shù)-1,返回朝群,程序繼續(xù)運行。如果計數(shù)為0行冰,則等待被碗。dispatch_semaphore_signal(semaphore)為計數(shù)+1操作,dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)為設置等待時間撒犀,這里設置的等待時間是一直等待福压。
對于以上代碼通俗一點就是,開始為0或舞,等待荆姆,等10個網絡請求都完成了,dispatch_semaphore_signal(semaphore)為計數(shù)+1映凳,然后計數(shù)-1返回胆筒,程序繼續(xù)執(zhí)行。 (這里也就是為什么有個count變量的原因诈豌,記錄網絡回調的次數(shù)仆救,回調10次之后再發(fā)信號量,使后面程序繼續(xù)運行)矫渔。
3.用GCD信號量實現(xiàn)順序執(zhí)行彤蔽,待所有請求完成后再進行相應操作。
```
-(void)Btn{
????NSString?*str?=?@"http://www.reibang.com/p/6930f335adba";
????NSURL?*url?=?[NSURL?URLWithString:str];
????NSURLRequest?*request?=?[NSURLRequest?requestWithURL:url];
????NSURLSession?*session?=?[NSURLSession?sharedSession];
????dispatch_semaphore_t?sem?=?dispatch_semaphore_create(0);
????for(inti=0;?i<10;?i++)?{
????????NSURLSessionDataTask?*task?=?[session?dataTaskWithRequest:request?completionHandler:^(NSData?*?_Nullable?data,?NSURLResponse?*?_Nullable?response,?NSError?*?_Nullable?error)?{
????????????NSLog(@"%d---%d",i,i);
????????????dispatch_semaphore_signal(sem);
????????}];
????????[task?resume];
????????dispatch_semaphore_wait(sem,?DISPATCH_TIME_FOREVER);
????}
????dispatch_async(dispatch_get_main_queue(),?^{
????????NSLog(@"end");
????});
}
```
注:1庙洼、2顿痪、3均為網絡請求執(zhí)行完后再執(zhí)行相應操作,但1油够、2的網絡請求為無序蚁袭,3的請網絡請求是按順序執(zhí)行。3是最耗時的JА?摹!
```