21

URL(NSURLで表される)が使用可能かどうか、または404を返すかどうかを確認する必要があります。これを実現するための最良の方法は何ですか。

可能であれば、代理人なしでこれをチェックする方法をお勧めします。URLが到達可能かどうかがわかるまで、プログラムの実行をブロックする必要があります。

4

4 に答える 4

39

ご存知かもしれませんが、一般的なエラーは didFailWithError メソッドでキャプチャできます。

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}

ただし、404 "Not Found" または 500 "Internal Server Error" の場合は、didReceiveResponse メソッド内でキャプチャできるはずです。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    if ([response respondsToSelector:@selector(statusCode)])
    {
        int statusCode = [((NSHTTPURLResponse *)response) statusCode];
        if (statusCode == 404)
        {
            [connection cancel];  // stop connecting; no more delegate messages
            NSLog(@"didReceiveResponse statusCode with %i", statusCode);
        }
    }
}
于 2009-09-10T10:14:57.653 に答える
30

デリゲートも使用しないソリューションが必要だったので、ここで他の回答に示されているコードの一部を取り、私の場合にうまく機能する簡単なメソッドを作成しました(また、あなたが探しているものかもしれません):

    -(BOOL) webFileExists {

        NSString *url = @"http://www.apple.com/somefile.html";

        NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
        NSHTTPURLResponse* response = nil;
        NSError* error = nil;
        [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        NSLog(@"statusCode = %d", [response statusCode]);

        if ([response statusCode] == 404)
            return NO;
        else
            return YES;
     }
于 2010-07-27T20:30:15.730 に答える
8

上記のwoodmantechからの回答を使用しましたが、ここで他の同様の質問で見たものに基づいて変更し、ファイル全体をダウンロードして存在するかどうかを確認しないようにしました。

に変更NSURLRequestNSMutableURLRequest、次を追加しました。

[request setHTTPMethod:@"HEAD"];

これはうまくいくようです。私は最初のアプリに取り組んでいるので、まだ実際の経験はありません. みんな、ありがとう。

 NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
    [request setHTTPMethod:@"HEAD"];
    NSHTTPURLResponse* response = nil;
    NSError* error = nil;
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSLog(@"statusCode = %d", [response statusCode]);
于 2014-02-20T00:45:02.143 に答える
2

以下を呼び出すことで、同期接続を実現できます。

NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

リクエストが行われるまで、スレッドはブロックされます。

于 2009-09-10T16:48:06.340 に答える