2010-06-06 2 views
4

Hey, j'ai un programme qui a besoin de savoir si une image en ligne existe, mais la seule façon que j'ai obtenu ce travail est en chargeant l'image dans un pointeur NSData et en vérifiant si le pointeur existe.Si l'url existe Objective-c

- (BOOL)exists { 
     NSString *filePath = @"http://couleeapps.hostei.com/BottomBox.png"; 
     NSURL *url = [NSURL URLWithString:filePath]; 
     NSData *imageData = [NSData dataWithContentsOfURL:url]; 
     if (imageData) { 
      return YES; 
     } 
      return NO; 
} 

Cela a fonctionné pour moi, mais mon problème est que j'ai une connexion très lente, et il prend une éternité à télécharger l'image. Donc ma question est: est-il un moyen de mettre en vérifiant si une image (disons "http://couleeapps.hostei.com/BottomBox.png") est disponible sans avoir à le télécharger dans une méthode de reporteur booléen?

aide est très appréciée

HiGuy

Répondre

16

Créer un NSURLConnection pour aller chercher l'URL. Définissez HTTPMethod sur NSURLRequest sur "HEAD" au lieu de "GET". Dans la méthode de délégué connection:didReceiveResponse:, vérifiez le statusCode du NSHTTPURLResponse pour 200 ou une autre réponse de succès.

-(void) queryResponseForURL:(NSURL *)inURL { 
    NSMutableURLRequest request = [NSMutableURLRequest requestWithURL:inURL]; 

    [request setHTTPMethod:@"HEAD"]; 

    NSURLConnection connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
    // connection starts automatically 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    if ([(NSHTTPURLResponse *)response statusCode] == 200) { 
    // url exists 
    } 
} 

Il pourrait y avoir d'autres status codes que vous traiteriez comme un succès, comme 301.

Une partie du protocole HTTP est le réglage de la request method. GET et POST sont les deux plus communs, mais il y en a plusieurs autres dont HEAD. HEAD dit envoyer la même réponse que vous enverriez pour GET, mais n'envoyez pas le corps. Dans votre cas, le corps est les données d'image. Donc, si HEAD réussit, vous pouvez supposer que GET réussira également de la même manière, au moins dans le cas de la recherche d'une ressource statique.

+0

Pourriez-vous expliquer un peu plus? Je trouve difficile à comprendre. –

+0

HEAD: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4 – JeremyP

+1

Ne devraient-ils pas être des pointeurs, c'est-à-dire 'NSMutableURLRequest * request'? –

1

connectionWithRequest est déprécié. Donc, vous devez utiliser dataTaskWithRequest:

-(void) queryResponseForURL:(NSURL *)inURL { 
     NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
     NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; 
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:inurl 
                   cachePolicy:NSURLRequestUseProtocolCachePolicy 
                  timeoutInterval:60.0]; 

     [request setHTTPMethod:@"HEAD"]; 
     NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
      NSUInteger respCode=[(NSHTTPURLResponse *)response statusCode]; 
      if (!error&&respCode == 200) { 
        // url exists 
      } else { 
        // url does not exist 
      } 

     }]; 
     [postDataTask resume]; 
    }