Проверка NSURLConnection - PullRequest
       14

Проверка NSURLConnection

2 голосов
/ 16 августа 2010

Я пытаюсь проверить, было ли соединение успешным, но получал непостоянные результаты. Когда я пытаюсь сделать синхронный запрос, используя поддельную ссылку с:

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

if (responseData)   
    {  
        did_send = TRUE;  
    }   
    else   
    {  
        did_send = FALSE;
    }

Он на некоторое время зависает и в итоге возвращается:

 did_send = FALSE;

Но если я сделаю асинхронный запрос, используя поддельный URL с:

NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:request delegate:self ];
if (conn)   
    {  
        did_send = TRUE;  
    }   
    else   
    {  
        did_send = FALSE;
    }

Я получаю:

did_send = TRUE;

каждый раз. Мне нужно, чтобы асинхронный запрос работал, потому что я могу установить тайм-аут и не должен зависать в течение 60 секунд, в то время как для запроса истекает время ожидания по умолчанию, которое не изменяется при асинхронных запросах. Есть идеи?

Ответы [ 2 ]

7 голосов
/ 16 августа 2010

Попробуйте использовать метод делегата класса nsurlconnection connection: didFailWithError: Это должно дать вам согласованные результаты.

-(void)getLocationsFromWebService {
    NSLog(@"in getLocationsFromWebService");


    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:TRUE];


    NSURLRequest *theRequest = [NSURLRequest requestWithURL:self.locationsURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:100.0];

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    self.requestType = @"GET";
    if (theConnection) {
        _responseData = [[NSMutableData data] retain ];
    } else {

        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:FALSE];
    }
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:FALSE]; 
    NSLog(@"in mapviewcontroller");
    NSLog(@"Error connecting - %@",[error localizedDescription]);
    [connection release];
    [_responseData release];
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

    NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response;
    NSInteger statusCode = [HTTPResponse statusCode];

    if (404 == statusCode || 500 == statusCode) {
        //[self.controller setTitle:@"Error Getting Parking Spot ....."];
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:FALSE];

        [connection cancel];
        NSLog(@"Server Error - %@", [NSHTTPURLResponse localizedStringForStatusCode:statusCode]);
    } else {
        if ([self.requestType isEqualToString:@"GET"])
            [_responseData setLength:0];
    }
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    if ([self.requestType isEqualToString:@"GET"])
        [_responseData appendData:data];
}

-(void) connectionDidFinishLoading:(NSURLConnection *)connection {

    if ([self.requestType isEqualToString:@"GET"]) {
        [self parseLocations:_responseData];
        [_responseData release];
    }
    [connection release];

}
1 голос
/ 17 августа 2010

Просто создание экземпляра NSURLConnection ничего не делает. Он создает экземпляр этого класса, но не начинает передачу данных - объект, как правило, не равен нулю, даже если запрос невозможно удовлетворить.

Скорее, ваш объект делегата (self в вашем коде) должен реализовать NSURLConnectionDelegate (который будет обрабатывать обратные вызовы, такие как «входящие данные» или «условие ошибки»). Затем вы должны отправить экземпляр NSURLConnection -start сообщение, которое запланирует его в цикле выполнения потока выполнения.

Для получения дополнительной информации о протоколе NSURLConnectionDelegate (включая информацию о том, что делать в ваших обратных вызовах), см. Apple * Руководство по программированию загрузки системы . "

...