当页面不可用时,为什么我会收到超时错误

时间:2012-12-19 06:46:20

标签: objective-c cocoa http

我使用NSString方法initWithContentsOfURL:usedEncoding:error:来获取某些网页的内容。我注意到,当我尝试访问的页面不存在时,此方法执行很长时间然后因超时错误而失败。我尝试使用NSURLRequestNSURLConnection类用于相同的目的,但得到相同的结果 - 执行很长时间然后超时错误。 当我尝试在浏览器中打开同一页面时,我会更快地得到响应,并且返回页面不可用错误。

看起来cocoa方法不会对页面名称执行dns解析,或者它们对该操作的超时时间更长。

所以我的问题,我使用的可可方法做dns解决吗?如果不这样做怎么办?

我使用的代码示例:

NSURL* url = [NSURL URLWithString:@"http://unexisting.domain.local"]; 
NSError* err = nil;
NSString* content = [NSString stringWithContentsOfURL:url usedEncoding:nil error:&err];

if (err) {
    NSLog(@"error: %@", err); 
} else {
    NSLog(@"content: %@", content);
}

NSURL* url = [NSURL URLWithString:@"http://unexisting.domain.local"]; 
NSURLRequest* request = [NSURLRequest requestWithURL:url];

NSURLResponse* response = nil;
NSError* err = nil;
NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];

if (err) {
    NSLog(@"error: %@", err); 
} else {
    NSString* content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"content: %@", content);
}

谢谢!

2 个答案:

答案 0 :(得分:0)

Gene M. answered如何使用SCNetworkReachability。以下是示例代码:

bool success = false;
const char *host_name = [@"stackoverflow.com" 
                         cStringUsingEncoding:NSASCIIStringEncoding];

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,
                                                                        host_name);
SCNetworkReachabilityFlags flags;
success = SCNetworkReachabilityGetFlags(reachability, &flags);
bool isAvailable = success && (flags & kSCNetworkFlagsReachable) && 
                             !(flags & kSCNetworkFlagsConnectionRequired);
if (isAvailable) {
    NSLog(@"Host is reachable: %d", flags);
}else{
    NSLog(@"Host is unreachable");
}

答案 1 :(得分:0)

如上所述,监控可达性(设备连接性)并对其做出反应绝对是一种很好的做法。

您还可以实施NSURLConnectionDelegate协议及其方法,例如

 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
      NSLog(@"**ERROR** %@", error);
      // Respond to error
 }

如果您没有连接,如果您没有连接,则应该获得NS99LConnection错误代码999和NSURLErrorCancelled = -999和/或NSURLErrorNotConnectedToInternet = -1009。至少您有一份报告发生了什么事。

文档: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html