我使用NSString
方法initWithContentsOfURL:usedEncoding:error:
来获取某些网页的内容。我注意到,当我尝试访问的页面不存在时,此方法执行很长时间然后因超时错误而失败。我尝试使用NSURLRequest
和NSURLConnection
类用于相同的目的,但得到相同的结果 - 执行很长时间然后超时错误。
当我尝试在浏览器中打开同一页面时,我会更快地得到响应,并且返回页面不可用错误。
看起来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);
}
谢谢!
答案 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
。至少您有一份报告发生了什么事。