문제

URL (NSURL로 표시)을 사용할 수 있는지 또는 404를 반환하는지 확인해야합니다.이를 달성하는 가장 좋은 방법은 무엇입니까?

가능한 경우 대의원없이 이것을 확인하는 방법을 선호합니다. URL에 도달 할 수 있는지 알 수있을 때까지 프로그램 실행을 차단해야합니다.

도움이 되었습니까?

해결책

이미 알고 있듯이 DidFailWithError 메소드에 의해 일반 오류가 캡처 될 수 있다는 것을 이미 알고있을 것입니다.

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

그러나 404 "Found"또는 500 "내부 서버 오류"의 경우 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);
        }
    }
}

다른 팁

대의원을 사용하지 않는 솔루션이 필요했기 때문에 여기에 다른 답변에 표시된 코드 조각을 가져 와서 제 경우에는 잘 작동하는 간단한 방법을 만들었습니다 (그리고 당신이 찾고있는 것도 될 수 있음).

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

위의 Woodmantech의 답변을 사용했지만 여기에서 다른 유사한 질문에서 본 내용을 기반으로 변경하여 전체 파일이 존재하는지 확인하지 않도록 변경했습니다.

나는 바뀌었다 NSURLRequest 에게 NSMutableURLRequest, 그리고 추가 :

[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]);

호출을 통해 동기 연결을 달성 할 수 있습니다.

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

요청이 이루어질 때까지 스레드가 차단됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top