Попытка кэширования uiImages в словаре, похоже, не влияет на время загрузки - PullRequest
0 голосов
/ 29 января 2011

Я использую стандартный метод кэширования для кэширования некоторых 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

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

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

Ответы [ 2 ]

0 голосов
/ 29 января 2011

Если вы используете [UIImage imageNamed:], он сделает все это за вас.Не нужно накатывать свой кеш, а потом удивляться, работает ли он.

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

0 голосов
/ 29 января 2011

Из документации для -[UIImage initWithContentsOfFile:]:

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

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

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