完成所有过程后NSURLConnection发送请求

时间:2016-04-27 06:16:00

标签: ios objective-c iphone nsurlconnection nsconnection

我有一个发送请求的嵌套循环。

-(void) download
{
   for(NSString *id in array)
   {
    //init with request and start the connection
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request deletegate:self];
    [conn start];
   }
}

-(void) connection:(NSURLConnection *) connection didReceiveData:(NSData *) data
{
//enter here secondly
}
-(void) connectionDidFinishLoading:(NSURLConnection *) connection
{
//enter here last, after finish the for loop
//my intention is use the downloaded data to do something before sending a new request.
}

问题是我想在for循环中再次发送请求之前先输入"-(void) connectionDidFinishLoading:(NSURLConnection *) connection"

但目前它将完成for循环并在输入"-(void) connectionDidFinishLoading:(NSURLConnection *) connection"之前发送所有请求。

3 个答案:

答案 0 :(得分:1)

您应该在iOS9中尝试 NSURLConnection 已弃用

Popen()

并使用for (NSString *URL in URLArray) { NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // check error and/or handle response here }]; [task resume]; }

为for循环dispatch_group_t group = dispatch_group_create();添加行将调用

dispatch_group_enter(group);

为你的目标

答案 1 :(得分:0)

在您的情况下,您需要尝试阻止功能,因为根据您的要求,您希望响应另一个请求的第一个连接。

for(NSString* url in array)
{
   // Generate a NSURLRequest object from the address of the API.
   NSURL *url = [NSURL URLWithString:urlLink];
   NSURLRequest *request = [NSURLRequest requestWithURL:url];

   // Send the request asynchronous request using block!
   [NSURLConnection sendAsynchronousRequest:request
                                      queue:[NSOperationQueue mainQueue]
                          completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

                           if (error) {
                               NSLog(@"Error in updateInfoFromServer: %@ %@", error, [error localizedDescription]);
                           } else if (!response) {
                               NSLog(@"Could not reach server!");
                           } else if (!data) {
                               NSLog(@"Server did not return any data!");
                           } else {
                               [self doStuffWithData:data];
                           }
                       }];
}

答案 2 :(得分:0)

URL加载不是同步操作(或者至少不应该同步进行),因为DNS查找失败最多可能需要90秒,如果服务器不断运行数据,则几乎无限长。如果你阻止主线程的时间只有一小部分,那么iOS会杀死你的应用程序。

您需要安排第一个请求(并且只安排第一个请求),而不是在循环中调度请求并等待它们完成。然后,在您的connectionDidFinishLoading:方法(也许是您的connection:DidFailWithError:方法)中,安排下一个请求。

话虽如此,除非您仍然需要支持iOS 6 / 10.8及更早版本,否则您应该使用NSURLSession。 (适用相同的一般建议;更改委托方法名称以保护有罪。)