2016-04-29 70 views
0

我需要做出多個http請求,但我需要等待請求的響應才能轉到下一個請求,但我無法弄清楚如何做到這一點。是否有任何身體知道我怎麼能做到這一點,而無需使用dispatch_semaphoreiOS:製作多個NSURLSession請求

這是我的代碼:

-(void)multipleReques:(NSArray*)arrayUrl 
{ 
    __block NSInteger *countFailures = 0; 

    for (NSString *urlStr in arrayUrl) 
    { 

     NSURL *URL = [NSURL URLWithString:urlStr]; 
     NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 
     NSURLSession *session = [NSURLSession sharedSession]; 
     NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
               completionHandler: 
             ^(NSData *data, NSURLResponse *response, NSError *error) { 

              if (error) 
              { 
               countFailures++; 
              } 
             }]; 
     [task resume]; 
    } 
} 

我會很感激你的幫助。

+0

嵌套完成塊?代表們? –

+0

@智偉彩你有沒有例子? – user2924482

+0

請參閱下面的答案。 –

回答

0

下面是做這件事:(僅僅一個簡短的演示,不知道這是否執行的話)

// Global variables somewhere... 
NSUInteger progress; 
NSUInteger failures; 

- (void)myFunction 
{ 
    // ... 
    progress = 0; 
    failures = 0; 
    [self makeRequestWithURLs:@[...]]; // an array of NSURLs. 
    // ... 
} 

- (void)makeRequestWithURLs:(NSURL *)arrayOfURLs 
{ 
    if ([arrayOfURLs count] <= progress) { 
    return; 
    } 

    NSURLRequest *request = [NSURLRequest requestWithURL:arrayOfURLs[progress]]; 
    NSURLSessionDataTask *task = [[NSURLSession sharedSession] 
    dataTaskWithRequest:request completionHandler:^(NSData *data, 
                NSURLResponse *response, 
                NSError *error) 
    { 
    if (error) { 
     failures++; 
    } else { 
     progress++; 
     [self makeRequestWithURLs:arrayOfURLs]; 
    } 
    }]; 
    [task resume]; 
} 
+0

你有代表與代表一起做的例子嗎? – user2924482

+0

沒有,因爲有太多可能的方式來做到這一點。上面的答案沒有解決你的問題嗎?你必須想出一個最適合你需求的解決方案。爲了所有目的,委派或不需要任何一站式的解決方案。 –

+0

您是否嘗試過將每個主機的最大連接數設置爲1?如果請求失敗,我希望能夠取得預期的效果,即從處理服務器初始響應的委託方法中取消會話中的所有其他未完成請求。 – dgatwood