Я использую стандартный метод кэширования для кэширования некоторых UIImages, загруженных из каталога Documents. Изображения отображаются в UITableView. Они довольно большие - сами изображения имеют размер до 600x600 и отображаются в изображениях размером 240x180 (на дисплее сетчатки, поэтому несоответствие res невелико).
Загрузка изображений в реальном времени вызывает некоторое отставание, когда на экране появляется новая ячейка. Итак, я реализовал метод кэширования в объекте, который обрабатывает изображение:
- (UIImage *)imageWithStyle:(NSString *)styleName {
NSLog(@"looking for image %@", self.imageFileName);
/* if we have a cached image in dictionary, return it */
if (imageCache == nil) imageCache = [[NSMutableDictionary alloc] init];
UIImage *returnImage = [imageCache objectForKey:styleName];
if (returnImage != nil) {
NSLog(@"returning cached image");
return returnImage;
}
/* otherwise, look for image at path */
NSString *path = [self cacheFilePathWithStyle:styleName];
UIImage * originalImage = [[UIImage alloc] initWithContentsOfFile:path];
/* if image doesnt exist at path, start download and return nil */
if (originalImage == nil) {
NSLog(@"image not found. downloading.");
[self downloadImageFromS3];
return nil;
}
/* found image at path */
/* scale image for screen */
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2){
returnImage = [UIImage imageWithCGImage:[[originalImage autorelease] CGImage] scale:2.0 orientation:UIImageOrientationUp];
NSLog(@"scaling image for retina");
} else {
returnImage = [originalImage autorelease];
NSLog(@"image scaled for standard resolution");
}
/* cache image in dictionary */
NSLog(@"caching image");
[imageCache setObject:returnImage forKey:styleName];
return returnImage;
}
Прежде чем табличное представление появится на экране, я заставляю все объекты обработки изображений запустить этот метод кэширования, чтобы гарантировать, что изображения присутствуют в словаре для извлечения, когда они должны быть отображены. По NSLog'у я вижу, что все работает как надо.
Я получаю производительность без задержек, но только после того, как изображение появилось один раз на экране. Итак, когда я первоначально вижу табличное представление, я прокручиваю вниз, и NSLogs говорят мне, что изображения извлекаются из кэша, но все равно я получаю ту же задержку загрузки. После того, как ячейка появилась на экране один раз, она загружается без задержки.
Есть что-то, чего я здесь не хватает? Есть ли что-то еще, что мне нужно, чтобы на самом деле кэшировать изображение? Загрузка и размещение в словаре, похоже, не помогает.
Спасибо!
UPDATE
Я уже отказался от этого. Есть несколько попыток заставить изображения загружаться, рисуя их в новом контексте, но я не знаком с основным графическим программированием на данный момент. Я попробовал некоторый код, которым поделились люди, но безуспешно.
Вместо этого я собираюсь отображать версии изображений в низком разрешении, когда табличное представление прокручивается, и загружать версии высокого разрешения, когда табличное представление прекращает прокручиваться, как объявлено через его методы делегата. По крайней мере, я знаю, что этот подход будет работать с любым количеством изображений.