Кэширование большего изображения с помощью AFNetworking
Я новичок в AFNetworking и меньше опыта в разработке iOS.
Я использую AFNetworking для загрузки изображения из интернета, вот код:
- (void)dowloadPoject {
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
BOOL __block responseFromCache = YES; // yes by default
void (^requestSuccessBlock)(AFHTTPRequestOperation *operation, id responseObject) = ^(AFHTTPRequestOperation *operation, id responseObject) {
if (responseFromCache) {
// response was returned from cache
NSLog(@"RESPONSE FROM CACHE: %@", responseObject);
}
else {
// response was returned from the server, not from cache
NSLog(@"RESPONSE From Server: %@", responseObject);
}
UIImage *downloadedImage = [[UIImage alloc] init];
downloadedImage = responseObject;
// Add & Reload Data
[self.projectImage addObject:downloadedImage];
[self.projectname addObject:@"ABC"];
[self reloadComingSoonProject];
[self reloadNewReleaseProject];
};
void (^requestFailureBlock)(AFHTTPRequestOperation *operation, NSError *error) = ^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"ERROR: %@", error);
};
AFHTTPRequestOperation *operation = [manager GET:@"http://i359.photobucket.com/albums/oo34/SenaSLA/walls/Forward-Arrow-Button.png"
parameters:nil
success:requestSuccessBlock
failure:requestFailureBlock];
operation.responseSerializer = [AFImageResponseSerializer serializer];
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
NSLog(@"bytesRead: %u, totalBytesRead: %lld, totalBytesExpectedToRead: %lld", bytesRead, totalBytesRead, totalBytesExpectedToRead);
[self.viewNavBar.progressbar setProgress:(totalBytesRead/totalBytesExpectedToRead) animated:YES];
}];
[operation setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
// this will be called whenever server returns status code 200, not 304
responseFromCache = NO;
return cachedResponse;
}];
}
Я искал в Интернете, и я до сих пор не могу найти правильное решение. Я попробовал это решение от Rckoenes, но это не работает для меня.
Мне удалось кэшировать изображение размером 4 КБ, но когда я пытаюсь использовать изображение размером 103 КБ, оно не кэшируется. Спасибо.
1 ответ
Вы можете попробовать увеличить размер кэша. В прошлый раз, когда я это проверял, сетевой код не кэшировался, если полученные данные превышали 5% от общего размера кэша (хотя, к сожалению, мне еще предстоит увидеть, как Apple четко сформулирует правила, применяемые во время кэширования).
В любом случае, если вы посмотрите на делегата приложения в примере проекта AFNetworking, это показывает и пример того, как указать размер кэша:
NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:cache];
Похоже, что кэш-память по умолчанию составляет всего 0,5 МБ, а кэш-память диска - 10 МБ. Увеличив кэш-память ОЗУ до 4 МБ, как показано выше, или больше, вы сможете кэшировать свое изображение размером 103 КБ (при условии, что все остальные критерии, такие как поля заголовка ответа и т. П., Разрешают это).