2010-06-06 26 views
4

嘿,我有一個程序需要知道在線圖像是否存在,但我得到這個工作的唯一方法是將圖像加載到一個NSData指針並檢查指針存在。如果URL存在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; 
} 

這對我有用,但我的問題是,我有一個非常緩慢的連接,它需要永遠下載圖像。所以我的問題是:有沒有一種方法可以檢查圖像(如「http://couleeapps.hostei.com/BottomBox.png」)是否可用,而無需使用布爾型記者方法下載它?

幫助深表感謝

HiGuy

回答

16

創建NSURLConnection獲取的URL。將NSURLRequestHTTPMethod設置爲"HEAD"而不是"GET"。在代表方法connection:didReceiveResponse:中檢查的statusCode以獲得200或其他成功響應。

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

有可能是其他status codes,你會當作成功,像301

部分HTTP協議是設置request method。 GET和POST是最常見的兩種,但還有其他幾種包括HEAD。 HEAD說,發送與GET相同的響應,但不要發送正文。在你的情況下,身體是圖像數據。因此,如果HEAD成功,您可以假設GET也會以相同的方式成功,至少在查找靜態資源的情況下。

+0

你能解釋這一點嗎?我發現很難理解。 – 2010-06-06 18:31:25

+0

HEAD:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4 – JeremyP 2010-06-07 13:04:08

+1

它們不應該是指針,即'NSMutableURLRequest * request'嗎? – 2014-01-17 15:20:12

1

connectionWithRequest已折舊。所以你必須使用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]; 
    }