Как включить дисковый кеш в AFNetworking на iOS

В моем iOS-приложении я являюсь категорией UIImageView, предоставленной AFNetworking для загрузки изображений, хранящихся в Amazon S3. Я думал, что по умолчанию кэш хранит кэшированные изображения на диске по умолчанию, однако по ряду причин (отсутствие заголовков HTTP и т. Д.) Я понял, что ошибся. Кажется, что изображения не кэшируются, они загружаются при каждом выполнении.

Поэтому я сейчас пытаюсь использовать пользовательский кеш, как это предлагается здесь http://blog.originate.com/blog/2014/02/20/afimagecache-vs-nsurlcache/

Вот что я сделал до сих пор (что, кажется, работает):

1) определил пользовательский NSURLCache с именем PlayerImageCache и инициализировал его в моем делегате приложения, чтобы использовать 5 МБ памяти и до 100 МБ дискового пространства

PlayerImageCache *sharedCache = [[PlayerImageCache alloc] initWithMemoryCapacity:5*1024*1024 diskCapacity:100*1024*1024 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];

2) переопределил метод storeCachedResponse, чтобы всегда кэшировать мои изображения

- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse
                 forRequest:(NSURLRequest *)request
{
    if ([request.URL.absoluteString hasPrefix:playersImagesPrefix])
    {
        NSCachedURLResponse *modifiedCachedResponse = [[NSCachedURLResponse alloc] initWithResponse:cachedResponse.response data:cachedResponse.data userInfo:cachedResponse.userInfo storagePolicy:NSURLCacheStorageAllowed];
        [super storeCachedResponse:modifiedCachedResponse forRequest:request];
    }
    else
    {
        [super storeCachedResponse:cachedResponse forRequest:request];
    }
}

3) forced every request to check the cache before downloading the image by using the NSURLRequestReturnCacheDataElseLoad policy

NSURLRequest *imageRequest = [NSURLRequest requestWithURL:[NSURL urlForPlayer:self.playerId] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60];
[self.playerImage setImageWithURLRequest:imageRequest placeholderImage:[UIImage imageNamed:@"playerprofile"] success:nil failure:nil];

Этого будет достаточно? Do I need to further customize my cache? Will this work even without the Cache-Control HTTP header?

1 ответ

Решение

Ответ - да! Отлично работает. Благодаря этой уловке мне удалось значительно уменьшить количество запросов.

Другие вопросы по тегам