Загрузить изображение с заголовками и кэшировать его - Objective- C (приложения для MacOS) - PullRequest
0 голосов
/ 27 февраля 2020

Мне нужно загрузить большое изображение из эскиза URL-адреса с помощью forHTTPHeaderField и кэшировать его, чтобы не загружать снова и снова из URL-адреса. Ниже приведен код, который я использую.

    NSString *urlStr =  [NSString stringWithFormat:@"%@",medialurl];
    NSURL *url = [NSURL URLWithString:urlStr];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setHTTPMethod:@"GET"];
    [request setURL:url];
    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request addValue:@"abcd" forHTTPHeaderField:@"ABC"];
    [request addValue:@"xyzzy" forHTTPHeaderField:@"XYZ"];

    [RestService fetchDataWithCompletionBlock:request completionHandler:^(NSData * _Nonnull responseData, NSURLResponse * _Nonnull response, NSError * _Nonnull error) {

    NSString *responseStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSLog(@"responseStr: %@", responseStr);

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
    long code = (long)[httpResponse statusCode];
    NSLog(@"response status code: %ld", code);

          completionBlock(responseData);
    }];

1 Ответ

1 голос
/ 27 февраля 2020

Поможет ли настройка другого cachePolicy по вашему запросу?

request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

Использовать существующие данные кэша, независимо от возраста или срока действия, загружая из исходного источника, только если нет кэшированных данных.

В свойстве cachePolicy есть примечание, в котором говорится:

Это свойство игнорируется для запросов, используемых для создания объектов NSURLSessionUploadTask и NSURLSessionDownloadTask, поскольку URL-адрес не поддерживает кэширование Загрузка системы для запросов на загрузку или загрузку.

Итак, если вы выполняете свой запрос именно так, это может не сработать, и вам, вероятно, придется самостоятельно управлять кэшированием для этого запроса.

Вы можете проверить, есть ли кешированный ответ на ваш запрос со следующим (при условии, что вы используете общий кэш, а не создаете свой собственный):

NSCachedURLResponse* cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];

if ( cachedResponse )
{
    NSHTTPURLResponse* response = (NSHTTPURLResponse*)cachedResponse.response;

    NSLog(@"Cached Response: %@", response.allHeaderFields);
}

else
{
    NSLog(@"No Cached Response");
}

Если ваша конечная точка использует ETags Вы также можете сохранить значение поля заголовка ETag из кэшированного ответа, а затем сравнить это к тому, что вы получите, когда делаете запрос, это сообщит вам, был ли ответ, который вы получили, действительно из кеша или нет.

Если вышеизложенное говорит вам, что для вашего запроса нет кэшированного ответа, тогда вам нужно выяснить, почему он может не кэшировать предыдущие ответы. Возможно, существует проблема с заголовком «Cache-Control», возвращаемым с сервера, и вам не разрешено кэшировать ответы? Если бы это было так, и вы не можете контролировать серверную часть, вам придется использовать другой метод для кэширования ваших изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...