溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

iOS如何實現(xiàn)當(dāng)多個網(wǎng)絡(luò)請求完成后執(zhí)行下一步

發(fā)布時間:2021-08-10 15:07:28 來源:億速云 閱讀:523 作者:小新 欄目:移動開發(fā)

小編給大家分享一下iOS如何實現(xiàn)當(dāng)多個網(wǎng)絡(luò)請求完成后執(zhí)行下一步,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

前言

在開發(fā)中,我們很容易遇到這樣的需求,需要我們同時做多個網(wǎng)絡(luò)請求,所有網(wǎng)絡(luò)請求都完成后才能進(jìn)行下一步的操作。

網(wǎng)絡(luò)請求的任務(wù)是提交給子線程異步處理了,網(wǎng)絡(luò)請求這樣的任務(wù)也就快速執(zhí)行完畢了,但是網(wǎng)絡(luò)請求是一個任務(wù),處理收到的網(wǎng)絡(luò)響應(yīng)又是一個任務(wù),注意不要把這兩個過程混為一談。

解決方法

1.首先,我們創(chuàng)建一個項目,然后做一般性的做法,不做任何處理去連續(xù)請求一個接口10次:

先在viewDidLoad中創(chuàng)建第一種情況.

//1.無處理
 UIButton *Btn1 = [UIButton buttonWithType:UIButtonTypeCustom];
 Btn1.frame = CGRectMake(100, 100, 100, 40);
 Btn1.backgroundColor = [UIColor grayColor];
 [Btn1 setTitle:@"noConduct" forState:UIControlStateNormal];
 [Btn1 addTarget:self action:@selector(Btn1) forControlEvents:UIControlEventTouchUpInside];
 [self.view addSubview:Btn1];

實現(xiàn)第一種情況的方法

//1.noConduct
-(void)Btn1{
 NSString *str = @"http://www.jianshu.com/p/6930f335adba";
 NSURL *url = [NSURL URLWithString:str];
 NSURLRequest *request = [NSURLRequest requestWithURL:url];
 NSURLSession *session = [NSURLSession sharedSession];
 
 for (int i=0; i<10; i++) {
 NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  
  NSLog(@"%d---%d",i,i);
  
 }];
 
 [task resume];
 }
 
 NSLog(@"end");
}

運(yùn)行,看看我們的控制臺輸出:

2017-12-04 17:10:10.503 DownImage[3289:261033] end
2017-12-04 17:10:10.676 DownImage[3289:261080] 0---0
2017-12-04 17:10:10.704 DownImage[3289:261080] 1---1
2017-12-04 17:10:10.754 DownImage[3289:261096] 4---4
2017-12-04 17:10:10.760 DownImage[3289:261080] 2---2
2017-12-04 17:10:10.800 DownImage[3289:261096] 5---5
2017-12-04 17:10:10.840 DownImage[3289:261080] 7---7
2017-12-04 17:10:10.844 DownImage[3289:261082] 6---6
2017-12-04 17:10:10.846 DownImage[3289:261096] 3---3
2017-12-04 17:10:10.888 DownImage[3289:261096] 8---8
2017-12-04 17:10:10.945 DownImage[3289:261080] 9---9

很明顯,無任何處理情況下,end最先被打印出來,由于網(wǎng)絡(luò)請求的異步回調(diào),然后各個網(wǎng)絡(luò)請求的回調(diào)順序是無序的。

2.使用GCD的dispatch_group_t

viewDidLoad里:

//2.group
 UIButton *Btn2 = [UIButton buttonWithType:UIButtonTypeCustom];
 Btn2.frame = CGRectMake(100, 200, 100, 40);
 Btn2.backgroundColor = [UIColor grayColor];
 [Btn2 setTitle:@"group--" forState:UIControlStateNormal];
 [Btn2 addTarget:self action:@selector(Btn2) forControlEvents:UIControlEventTouchUpInside];
 [self.view addSubview:Btn2];

實現(xiàn):

//2.group--
-(void)Btn2{
 NSString *str = @"http://www.jianshu.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 (int i=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");
 });
}

運(yùn)行看看控制臺輸出:

2017-12-04 17:14:46.984 DownImage[3289:265374] 2---2
2017-12-04 17:14:46.987 DownImage[3289:265370] 1---1
2017-12-04 17:14:47.052 DownImage[3289:265383] 5---5
2017-12-04 17:14:47.065 DownImage[3289:265370] 4---4
2017-12-04 17:14:47.111 DownImage[3289:265379] 3---3
2017-12-04 17:14:47.121 DownImage[3289:265383] 6---6
2017-12-04 17:14:47.169 DownImage[3289:265383] 7---7
2017-12-04 17:14:47.192 DownImage[3289:265370] 9---9
2017-12-04 17:14:47.321 DownImage[3289:265383] 8---8
2017-12-04 17:14:47.747 DownImage[3289:265374] 0---0
2017-12-04 17:14:47.747 DownImage[3289:261033] end
2017-12-04 17:15:14.576 DownImage[3289:265942] 3---3
2017-12-04 17:15:14.626 DownImage[3289:265936] 2---2
2017-12-04 17:15:14.647 DownImage[3289:265944] 4---4
2017-12-04 17:15:14.648 DownImage[3289:265936] 0---0
2017-12-04 17:15:14.657 DownImage[3289:265943] 1---1
2017-12-04 17:15:14.709 DownImage[3289:265944] 5---5
2017-12-04 17:15:14.728 DownImage[3289:265944] 6---6
2017-12-04 17:15:14.734 DownImage[3289:265944] 7---7
2017-12-04 17:15:14.738 DownImage[3289:265943] 8---8
2017-12-04 17:15:14.816 DownImage[3289:265944] 9---9
2017-12-04 17:15:14.816 DownImage[3289:261033] end

從上兩次輸出可以看出,end確實是在所有網(wǎng)絡(luò)請求之后才輸出出來,這也是符合了我們的需求。

代碼中我們只添加了4行代碼

dispatch_group_t downloadGroup = dispatch_group_create();
dispatch_group_enter(downloadGroup);
dispatch_group_leave(downloadGroup);
dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{
 });

對以上4行代碼可理解為:創(chuàng)建一個dispatch_group_t, 每次網(wǎng)絡(luò)請求前先dispatch_group_enter,請求回調(diào)后再dispatch_group_leave,對于enter和leave必須配合使用,有幾次enter就要有幾次leave,否則group會一直存在。當(dāng)所有enter的block都leave后,會執(zhí)行dispatch_group_notify的block。

3.使用GCD的信號量dispatch_semaphore_t

//3.semaphore
 UIButton *Btn3 = [UIButton buttonWithType:UIButtonTypeCustom];
 Btn3.frame = CGRectMake(100, 300, 100, 40);
 Btn3.backgroundColor = [UIColor grayColor];
 [Btn3 setTitle:@"semaphore" forState:UIControlStateNormal];
 [Btn3 addTarget:self action:@selector(Btn3) forControlEvents:UIControlEventTouchUpInside];
 [self.view addSubview:Btn3];
//3.semaphore--
-(void)Btn3{
 NSString *str = @"http://www.jianshu.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 (int i=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");
 });
}

運(yùn)行看看控制臺輸出:

2017-12-04 17:36:49.098 DownImage[3428:283651] 2---2
2017-12-04 17:36:49.144 DownImage[3428:284210] 0---0
2017-12-04 17:36:49.152 DownImage[3428:284213] 3---3
2017-12-04 17:36:49.158 DownImage[3428:283651] 1---1
2017-12-04 17:36:49.167 DownImage[3428:284210] 4---4
2017-12-04 17:36:49.235 DownImage[3428:284213] 8---8
2017-12-04 17:36:49.249 DownImage[3428:283651] 5---5
2017-12-04 17:36:49.252 DownImage[3428:283651] 7---7
2017-12-04 17:36:49.324 DownImage[3428:283651] 9---9
2017-12-04 17:36:49.468 DownImage[3428:284214] 6---6
2017-12-04 17:36:49.469 DownImage[3428:283554] end
2017-12-04 17:37:11.554 DownImage[3428:284747] 0---0
2017-12-04 17:37:11.555 DownImage[3428:284733] 1---1
2017-12-04 17:37:11.627 DownImage[3428:284748] 5---5
2017-12-04 17:37:11.661 DownImage[3428:284748] 2---2
2017-12-04 17:37:11.688 DownImage[3428:284747] 4---4
2017-12-04 17:37:11.709 DownImage[3428:284747] 6---6
2017-12-04 17:37:11.770 DownImage[3428:284733] 7---7
2017-12-04 17:37:11.774 DownImage[3428:284733] 8---8
2017-12-04 17:37:11.824 DownImage[3428:284747] 9---9
2017-12-04 17:37:11.899 DownImage[3428:284733] 3---3
2017-12-04 17:37:11.900 DownImage[3428:283554] end

從輸出可以看出,這樣的方法也是滿足我們的需求的,在這個方法中,我們使用了

dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_semaphore_signal(sem);
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

對這三句代碼可以這樣理解:dispatch_semaphore信號量為基于計數(shù)器的一種多線程同步機(jī)制。如果semaphore計數(shù)大于等于1,計數(shù)-1,返回,程序繼續(xù)運(yùn)行。如果計數(shù)為0,則等待。dispatch_semaphore_signal(semaphore)為計數(shù)+1操作,dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)為設(shè)置等待時間,這里設(shè)置的等待時間是一直等待。

對于以上代碼通俗一點(diǎn)就是,開始為0,等待,等10個網(wǎng)絡(luò)請求都完成了,dispatch_semaphore_signal(semaphore)為計數(shù)+1,然后計數(shù)-1返回,程序繼續(xù)執(zhí)行。 (這里也就是為什么有個count變量的原因,記錄網(wǎng)絡(luò)回調(diào)的次數(shù),回調(diào)10次之后再發(fā)信號量,使后面程序繼續(xù)運(yùn)行)。

4.考慮新需求,10個網(wǎng)絡(luò)請求順序回調(diào)。

需求需要順序回調(diào),即執(zhí)行完第一個網(wǎng)絡(luò)請求后,第二個網(wǎng)絡(luò)請求回調(diào)才可被執(zhí)行,簡單來講就是輸出得是0,1,2,3...9這種方式的。

對于這個需求我也是根據(jù)自己最近做的項目來提的,因為網(wǎng)絡(luò)請求回調(diào)的異步性,我們雖可以控制網(wǎng)絡(luò)請求的順序執(zhí)行,卻不能控制它的完成回調(diào)順序。這就有點(diǎn)傷了,目前我項目是找到了解決方案,但這個問題還沒有找到解決辦法,提出來跟大家討論一下。(請忽略網(wǎng)絡(luò)請求執(zhí)行,回調(diào),在回調(diào)里請求下一個接口的辦法,討論還有沒有別的方法,最好show the code).

最后,貼點(diǎn)NSOperation的代碼,為了解決新需求所寫,由于網(wǎng)絡(luò)請求回調(diào)異步性不能滿足需求,但若不是網(wǎng)絡(luò)請求等異步回調(diào)的方式,這樣的做法是可以的,大家可以試試.

//4.NSOperation
 UIButton *Btn4 = [UIButton buttonWithType:UIButtonTypeCustom];
 Btn4.frame = CGRectMake(100, 400, 100, 40);
 Btn4.backgroundColor = [UIColor grayColor];
 [Btn4 setTitle:@"NSOperation" forState:UIControlStateNormal];
 [Btn4 addTarget:self action:@selector(Btn4) forControlEvents:UIControlEventTouchUpInside];
 [self.view addSubview:Btn4];
//4.NSOperation
-(void)Btn4{
 NSString *str = @"http://www.jianshu.com/p/6930f335adba";
 NSURL *url = [NSURL URLWithString:str];
 NSURLRequest *request = [NSURLRequest requestWithURL:url];
 NSURLSession *session = [NSURLSession sharedSession];
 
 NSMutableArray *operationArr = [[NSMutableArray alloc]init];
 for (int i=0; i<10; i++) {
  NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
   NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    
    NSLog(@"%d---%d",i,i);
    
   }];
   
   [task resume];

   //非網(wǎng)絡(luò)請求
   NSLog(@"noRequest-%d",i);
  }];
  
  [operationArr addObject:operation];
  if (i>0) {
   NSBlockOperation *operation1 = operationArr[i-1];
   NSBlockOperation *operation2 = operationArr[i];
   [operation2 addDependency:operation1];
  }
 }
 
 NSOperationQueue *queue = [[NSOperationQueue alloc]init];
 [queue addOperations:operationArr waitUntilFinished:NO]; //YES會阻塞當(dāng)前線程
#warning - 絕對不要在應(yīng)用主線程中等待一個Operation,只能在第二或次要線程中等待。阻塞主線程將導(dǎo)致應(yīng)用無法響應(yīng)用戶事件,應(yīng)用也將表現(xiàn)為無響應(yīng)。
 
}

運(yùn)行結(jié)果:

2017-12-04 18:03:10.224 DownImage[3584:304363] noRequest-0
2017-12-04 18:03:10.226 DownImage[3584:304362] noRequest-1
2017-12-04 18:03:10.226 DownImage[3584:304363] noRequest-2
2017-12-04 18:03:10.231 DownImage[3584:304363] noRequest-3
2017-12-04 18:03:10.232 DownImage[3584:304362] noRequest-4
2017-12-04 18:03:10.233 DownImage[3584:304362] noRequest-5
2017-12-04 18:03:10.233 DownImage[3584:304363] noRequest-6
2017-12-04 18:03:10.234 DownImage[3584:304363] noRequest-7
2017-12-04 18:03:10.235 DownImage[3584:304363] noRequest-8
2017-12-04 18:03:10.236 DownImage[3584:304363] noRequest-9
2017-12-04 18:03:10.408 DownImage[3584:304597] 2---2
2017-12-04 18:03:10.408 DownImage[3584:304597] 0---0
2017-12-04 18:03:10.409 DownImage[3584:304597] 1---1
2017-12-04 18:03:10.461 DownImage[3584:304597] 5---5
2017-12-04 18:03:10.476 DownImage[3584:304363] 4---4
2017-12-04 18:03:10.477 DownImage[3584:304365] 6---6
2017-12-04 18:03:10.518 DownImage[3584:304365] 7---7
2017-12-04 18:03:10.537 DownImage[3584:304596] 8---8
2017-12-04 18:03:10.547 DownImage[3584:304362] 9---9
2017-12-04 18:03:11.837 DownImage[3584:304362] 3---3
2017-12-04 18:04:27.699 DownImage[3584:306401] noRequest-0
2017-12-04 18:04:27.700 DownImage[3584:306405] noRequest-1
2017-12-04 18:04:27.701 DownImage[3584:306401] noRequest-2
2017-12-04 18:04:27.701 DownImage[3584:306405] noRequest-3
2017-12-04 18:04:27.702 DownImage[3584:306401] noRequest-4
2017-12-04 18:04:27.702 DownImage[3584:306405] noRequest-5
2017-12-04 18:04:27.703 DownImage[3584:306401] noRequest-6
2017-12-04 18:04:27.703 DownImage[3584:306401] noRequest-7
2017-12-04 18:04:27.704 DownImage[3584:306401] noRequest-8
2017-12-04 18:04:27.704 DownImage[3584:306401] noRequest-9
2017-12-04 18:04:27.772 DownImage[3584:306397] 2---2
2017-12-04 18:04:27.779 DownImage[3584:306401] 0---0
2017-12-04 18:04:27.782 DownImage[3584:306409] 1---1
2017-12-04 18:04:27.800 DownImage[3584:306405] 3---3
2017-12-04 18:04:27.851 DownImage[3584:306401] 6---6
2017-12-04 18:04:27.855 DownImage[3584:306397] 5---5
2017-12-04 18:04:27.915 DownImage[3584:306397] 7---7
2017-12-04 18:04:27.951 DownImage[3584:306397] 9---9
2017-12-04 18:04:27.953 DownImage[3584:306405] 8---8
2017-12-04 18:04:28.476 DownImage[3584:306409] 4---4

5.還是使用信號量semaphore完成4的需求

//5.semaphore---order
 UIButton *Btn5 = [UIButton buttonWithType:UIButtonTypeCustom];
 Btn5.frame = CGRectMake(100, 500, 100, 40);
 Btn5.backgroundColor = [UIColor grayColor];
 [Btn5 setTitle:@"order" forState:UIControlStateNormal];
 [Btn5 addTarget:self action:@selector(Btn5) forControlEvents:UIControlEventTouchUpInside];
 [self.view addSubview:Btn5];
//5.semaphore--order
-(void)Btn5{
 NSString *str = @"http://www.jianshu.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 (int i=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");
 });
}

我們看看運(yùn)行結(jié)果:

2017-12-05 10:17:28.175 DownImage[938:51296] 0---0
2017-12-05 10:17:28.331 DownImage[938:51289] 1---1
2017-12-05 10:17:28.506 DownImage[938:51289] 2---2
2017-12-05 10:17:28.563 DownImage[938:51289] 3---3
2017-12-05 10:17:28.662 DownImage[938:51289] 4---4
2017-12-05 10:17:28.733 DownImage[938:51296] 5---5
2017-12-05 10:17:28.792 DownImage[938:51296] 6---6
2017-12-05 10:17:28.856 DownImage[938:51286] 7---7
2017-12-05 10:17:29.574 DownImage[938:51289] 8---8
2017-12-05 10:17:29.652 DownImage[938:51286] 9---9
2017-12-05 10:17:29.653 DownImage[938:45252] end
2017-12-05 10:17:46.341 DownImage[938:51608] 0---0
2017-12-05 10:17:47.967 DownImage[938:51607] 1---1
2017-12-05 10:17:48.038 DownImage[938:51603] 2---2
2017-12-05 10:17:48.132 DownImage[938:51603] 3---3
2017-12-05 10:17:48.421 DownImage[938:51608] 4---4
2017-12-05 10:17:48.537 DownImage[938:51289] 5---5
2017-12-05 10:17:48.646 DownImage[938:51289] 6---6
2017-12-05 10:17:48.939 DownImage[938:51289] 7---7
2017-12-05 10:17:50.537 DownImage[938:51607] 8---8
2017-12-05 10:17:50.615 DownImage[938:51289] 9---9
2017-12-05 10:17:50.616 DownImage[938:45252] end

我們對比 3 的代碼,3 中我們只在最后也就是循環(huán)結(jié)束后調(diào)用dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER) ,循環(huán)中當(dāng)網(wǎng)絡(luò)請求回調(diào)10次(也就是都回調(diào)完)后,使傳入的信號量加1:( dispatch_semaphore_signal(sem) ) ,這時等待結(jié)束,然后進(jìn)行后續(xù)的操作。

在這個方法里,我們每一次遍歷,都讓其dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER) ,這個時候線程會等待,阻塞當(dāng)前線程,直到dispatch_semaphore_signal(sem)調(diào)用之后,而我們dispatch_semaphore_signal(sem)是在網(wǎng)絡(luò)請求的回調(diào)里調(diào)用的,所以這個方法的邏輯是:

遍歷—>發(fā)起任務(wù)—>等待—>任務(wù)完成信號量加1—>等待結(jié)束,開始下一個任務(wù)

發(fā)起任務(wù)—>等待—>任務(wù)完成信號量加1—>等待結(jié)束,開始下一個任務(wù)

發(fā)起任務(wù)—>等待—>任務(wù)完成信號量加1—>等待結(jié)束,開始下一個任務(wù)

這樣循環(huán)的模式,一個任務(wù)完成才能接著去做下面的任務(wù),滿足我們的需求。

但我們也要發(fā)現(xiàn)這樣一個問題,我們使用這種方式,可以明顯感覺出整個過程需要花費(fèi)的時間大大增加了,不像我們 3 中同時(幾乎)開啟任務(wù)等待完成回調(diào),這里是一個網(wǎng)絡(luò)請求發(fā)出,等待,完成后發(fā)出第二個網(wǎng)絡(luò)請求,等待,完成后再發(fā)出第三個,這樣我們等待的時間是10個網(wǎng)絡(luò)請求每一個回調(diào)時間的和,在時間上大大增加了消耗,而且對于dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER) ,它是會阻塞線程的,我們?nèi)绻枰诰W(wǎng)絡(luò)請求完成后修改UI,那這種方式會影響我們的界面交互,接下來我們對比一下兩者時間消耗:

3-------------3----------3-------
2017-12-05 10:29:51.178 DownImage[938:56971] 2---2
2017-12-05 10:29:51.193 DownImage[938:57200] 0---0
2017-12-05 10:29:51.202 DownImage[938:56631] 3---3
2017-12-05 10:29:51.248 DownImage[938:56971] 1---1
2017-12-05 10:29:51.262 DownImage[938:56971] 5---5
2017-12-05 10:29:51.291 DownImage[938:56631] 6---6
2017-12-05 10:29:51.375 DownImage[938:56631] 7---7
2017-12-05 10:29:51.384 DownImage[938:56631] 4---4
2017-12-05 10:29:51.434 DownImage[938:56971] 8---8
2017-12-05 10:29:51.487 DownImage[938:57199] 9---9
2017-12-05 10:29:51.488 DownImage[938:45252] end

5-------------5----------5-------
2017-12-05 10:29:52.190 DownImage[938:56631] 0---0
2017-12-05 10:29:52.304 DownImage[938:57199] 1---1
2017-12-05 10:29:52.432 DownImage[938:56971] 2---2
2017-12-05 10:29:52.520 DownImage[938:56971] 3---3
2017-12-05 10:29:52.576 DownImage[938:56631] 4---4
2017-12-05 10:29:52.628 DownImage[938:56971] 5---5
2017-12-05 10:29:52.706 DownImage[938:56631] 6---6
2017-12-05 10:29:52.764 DownImage[938:56971] 7---7
2017-12-05 10:29:52.853 DownImage[938:56631] 8---8
2017-12-05 10:29:52.925 DownImage[938:56971] 9---9
2017-12-05 10:29:52.926 DownImage[938:45252] end

看得出3花費(fèi)時間為51.488 - 51.178約300多ms

--- ---5花費(fèi)時間為52.926 - 52.190約700多ms

以上是“iOS如何實現(xiàn)當(dāng)多個網(wǎng)絡(luò)請求完成后執(zhí)行下一步”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

ios
AI