1.使用GCD的dispatch_group_t
```
-(void)Btn{
????NSString?*str?=?@"http://www.lxweimin.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.lxweimin.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信號量為基于計數器的一種多線程同步機制。如果semaphore計數大于等于1,計數-1,返回,程序繼續運行。如果計數為0,則等待。dispatch_semaphore_signal(semaphore)為計數+1操作,dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)為設置等待時間,這里設置的等待時間是一直等待。
對于以上代碼通俗一點就是,開始為0,等待,等10個網絡請求都完成了,dispatch_semaphore_signal(semaphore)為計數+1,然后計數-1返回,程序繼續執行。 (這里也就是為什么有個count變量的原因,記錄網絡回調的次數,回調10次之后再發信號量,使后面程序繼續運行)。
3.用GCD信號量實現順序執行,待所有請求完成后再進行相應操作。
```
-(void)Btn{
????NSString?*str?=?@"http://www.lxweimin.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均為網絡請求執行完后再執行相應操作,但1、2的網絡請求為無序,3的請網絡請求是按順序執行。3是最耗時的!!!
```