Если URL существует Objective-c - PullRequest
4 голосов
/ 06 июня 2010

Эй, у меня есть программа, которая должна сказать, существует ли изображение в сети, но единственный способ, с помощью которого я получил это, - загрузить изображение в указатель 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") доступно без необходимости загружать его с помощью метода Boolean Reporter?

Помощь очень ценится

HiGuy

Ответы [ 2 ]

16 голосов
/ 06 июня 2010

Создайте NSURLConnection для получения URL. Установите HTTPMethod для NSURLRequest на "HEAD" вместо "GET". В методе делегата connection:didReceiveResponse: проверьте statusCode из NSHTTPURLResponse для 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
  }
}

Могут быть и другие коды состояния , которые вы считаете успешными, например, 301.

Часть протокола HTTP устанавливает метод запроса . GET и POST являются двумя наиболее распространенными, но есть несколько других, включая HEAD. HEAD говорит, что отправьте тот же ответ, который вы отправите для GET, но не отправляйте тело. В вашем случае тело это данные изображения. Таким образом, если HEAD завершается успешно, вы можете предположить, что GET также будет успешным таким же образом, по крайней мере, в случае поиска статического ресурса.

1 голос
/ 29 ноября 2015

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];
    }
...