4

嘿,我有一个程序需要判断在线图像是否存在,但我让它工作的唯一方法是将图像加载到 NSData 指针中并检查指针是否存在。

- (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 ”)是否可用,而无需以布尔报告方法下载它?

非常感谢帮助

嗨盖伊

4

2 回答 2

16

创建一个NSURLConnection以获取 url。将 的 设置HTTPMethodNSURLRequest"HEAD"不是"GET"。在委托方法中connection:didReceiveResponse:检查200 或其他成功响应。statusCodeNSHTTPURLResponse

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

可能还有其他您认为成功的状态代码,例如 301。

HTTP 协议的一部分是设置请求方法。GET 和 POST 是最常见的两个,但还有其他几个,包括 HEAD。HEAD 表示发送与 GET 相同的响应,但不要发送正文。在您的情况下,主体是图像数据。因此,如果 HEAD 成功,您可以假设 GET 也会以相同的方式成功,至少在查找静态资源的情况下是这样。

于 2010-06-06T18:23:33.927 回答
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];
    }
于 2015-11-29T20:56:49.433 回答