iOS多個網絡請求執行

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是最耗時的!!!


```

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容