3

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);
}

ありがとう!

4

2 に答える 2

0

Gene M.は、を使用してそれを行う方法に答え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");
}
于 2012-12-19T18:28:00.113 に答える
0

到達可能性(デバイスの接続性)を監視し、上記のようにそれに反応することは間違いなく良い習慣です。

NSURLConnectionDelegateプロトコルとそのメソッドを実装することもできます。

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

接続されていない場合は、999のNSURLConnectionエラーコードを取得する必要があります。接続されていない場合はNSURLErrorCancelled = -999、aNSURLErrorNotConnectedToInternet = -1009などが表示されます。少なくとも、何が起こっているかについてのレポートがあります。

ドキュメント: https ://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html

于 2012-12-19T18:42:44.207 に答える