2015-09-06 3 views
0

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

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

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

Будет ли этого достаточно? Нужно ли мне дополнительно настраивать кеш? Будет ли это работать даже без HTTP-заголовка Cache-Control?

ответ

0

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

Смежные вопросы