Frage

Ich muss überprüfen, ob eine URL (dargestellt durch eine NSURL) verfügbar ist oder 404 zurückgibt. Was ist der beste Weg, um das zu erreichen?

Ich würde es vorziehen, dies ohne Delegierter zu überprüfen, wenn möglich. Ich muss die Programmausführung blockieren, bis ich weiß, ob die URL erreichbar ist oder nicht.

War es hilfreich?

Lösung

Wie Sie vielleicht bereits wissen, kann der allgemeine Fehler durch DidfailWitherRor -Methode erfassen:

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

Aber für 404 "nicht gefunden" oder 500 "interner Serverfehler" sollte in der Lage sein, innerhalb der DidReceiversponse -Methode zu erfassen:

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

Andere Tipps

Ich brauchte auch eine Lösung, die auch keinen Delegierten verwendete. Deshalb habe ich in anderen Antworten in anderen Antworten gezeigt und eine einfache Methode erstellt, die in meinem Fall gut funktioniert (und möglicherweise auch das ist, wonach Sie auch suchen):

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

Ich habe die Antwort von Woodmantech oben verwendet, sie aber basierend auf dem geändert, was ich hier auf anderen ähnlichen Fragen gesehen habe, damit sie nicht die gesamte Datei herunterladen, um festzustellen, ob sie vorhanden ist.

ich habe mich verändert NSURLRequest zu NSMutableURLRequest, und fügte hinzu:

[request setHTTPMethod:@"HEAD"];

Dies scheint gut zu funktionieren. Ich arbeite an meiner ersten App, also noch keine wirkliche Erfahrung. Vielen Dank an alle.

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

Sie können eine synchrone Verbindung durch Anrufe erzielen:

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

Ihr Thread blockiert, bis die Anfrage Beeen gestellt wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top