Используете системный кеш объектов UIImage с изображениями, загруженными из дискового кеша (NSCachesDirectory)?

Я пытаюсь повысить производительность прокрутки UITableView, в котором используются ячейки с изображениями, полученными из Интернета, но хранящимися в NSCachesDirectory. Ячейки имеют настраиваемое представление содержимого для рисования содержимого (изображения).

Когда я использую изображение-заполнитель из пакета приложений, используя [UIImage imageNamed:@"Placeholder.png"], прокрутка выполняется очень быстро.

Когда я загружаю изображение из кеша диска (NSCachesDirectory) с помощью [UIImage imageWithContentsOfFile:cachePath], скорость прокрутки ухудшается.

Согласно документации, imageNamed: кеширует изображение, а imageWithContentsOfFile: - нет.

Как использовать системный кеш UIImage при использовании imageWithContentsOfFile:?

Огромное спасибо!


person Martijn Thé    schedule 21.02.2010    source источник
comment
Возможно, вы захотите увидеть недавний вопрос, в котором я решил проблему, хранение несжатого изображения.   -  person Victor Engel    schedule 28.09.2013


Ответы (3)


Кажется возможным использовать путь к изображению в NSCachesDirectory в качестве аргумента для метода [UIImage imageNamed:]. Метод принимает относительные пути (относительно пакета приложений), например: @"../Library/Caches/SomeCachedImage.png" работает.

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

person Martijn Thé    schedule 24.02.2010
comment
Для меня этот метод [UIImage imageNamed:] не может загрузить изображение, которое я передаю по определенному пути, всегда возвращает nil - person vodkhang; 20.08.2010
comment
работает на меня. Попробую с NSPicturesDirectory, оно того стоит! - person Nielsou Hacken-Bergen; 31.08.2011

Проблема, скорее всего, в том, что вы загружаете и распаковываете изображение в основном цикле выполнения. Это заблокирует пользовательский интерфейс на короткое время. Вы получите гораздо лучшую производительность, если выполните загрузку и распаковку в отдельном потоке и только установите изображение в основном цикле. (Что также требуется для изменений пользовательского интерфейса, которые устанавливают изображение в UIImageView)

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

person Stefan Arentz    schedule 21.02.2010
comment
Да, именно в этом и проблема. Я надеялся на готовое решение. Но я думаю, этого там нет. Спасибо за ответ. - person Martijn Thé; 22.02.2010
comment
Если вам нравится ответ, вы должны проголосовать за него или пометить его как решенный. - person Stefan Arentz; 22.02.2010
comment
UIImage лениво распаковывает данные растрового изображения, поэтому во многих (большинстве?) Ситуаций это не поможет - загрузка с диска будет происходить в фоновом потоке, но распаковка (которая часто занимает больше времени, чем загрузка данных) произойдет, когда вы установите изображение, которое должно происходить в основном потоке. - person Nick Forge; 29.09.2011

Вы не можете. imageWithContentsOfFile: всегда будет загружать изображение из файла (хотя и лениво). Что вы можете сделать, так это создать собственный кеш в памяти с помощью NSArrays или NSDictionaries, в зависимости от того, как вы хотите выполнять поиск.

person Mihai Damian    schedule 21.02.2010