2010-08-16 36 views
2

我想验证天气连接是否成功,但一直得到不稳定的结果。当我尝试使用伪造的URL与做一个同步请求:NSURLConnection验证

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秒,而请求超时且超时时间与异步请求不可更改。有任何想法吗?

+0

它不是一个真正的答案,但对于异步请求,我发现使用ASIHTTPRequest比Apple apis本身更容易/易于理解。 – 2010-08-16 18:49:51

回答

7

尝试使用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]; 

} 
+0

你能否提供一些例子来说明如何使用这种方法来解决我的问题? – jcb344 2010-08-16 20:50:03

+0

我已经添加了一些我自己的代码给我的答案。无论如何,请随时使用它:) – ennuikiller 2010-08-16 22:32:37

1

简单实例化NSURLConnection什么都不做。它创建该类的一个实例,但不会开始数据传输 - 即使请求无法满足,该对象通常也不会为零。

相反,您的委托对象(self在你的代码)需要实现NSURLConnectionDelegate(其将处理回调,如“输入数据”或“错误条件”。)然后,你必须发送NSURLConnection实例-start消息,这将将它安排在执行线程的运行循环中。

有关NSURLConnectionDelegate协议的详细信息(包括有关在回调中做什么的信息),请参阅Apple的“URL Loading System Programming Guide”。