Я пытаюсь повысить производительность прокрутки UITableView, в котором используются ячейки с изображениями, полученными из Интернета, но хранящимися в NSCachesDirectory. Ячейки имеют настраиваемое представление содержимого для рисования содержимого (изображения).
Когда я использую изображение-заполнитель из пакета приложений, используя [UIImage imageNamed:@"Placeholder.png"], прокрутка выполняется очень быстро.
Когда я загружаю изображение из кеша диска (NSCachesDirectory) с помощью [UIImage imageWithContentsOfFile:cachePath], скорость прокрутки ухудшается.
Согласно документации, imageNamed: кеширует изображение, а imageWithContentsOfFile: - нет.
Как использовать системный кеш UIImage при использовании imageWithContentsOfFile:?
Огромное спасибо!
Ответ 1 · рейтинг 8 · Martijn Thé
Кажется возможным использовать путь к изображению в NSCachesDirectory в качестве аргумента для метода [UIImage imageNamed:]. Метод принимает относительные пути (относительно пакета приложений), например: @"../Library/Caches/SomeCachedImage.png" работает.
UIImage автоматически кэширует изображение в памяти, если оно используется несколько раз, что повышает производительность, когда изображение используется несколько раз в табличном представлении.
Ответ 2 · рейтинг 3 · Stefan Arentz
Проблема, скорее всего, в том, что вы загружаете и распаковываете изображение в основном цикле выполнения. Это заблокирует пользовательский интерфейс на короткое время. Вы получите гораздо лучшую производительность, если выполните загрузку и распаковку в отдельном потоке и только установите изображение в основном цикле. (Что также требуется для изменений пользовательского интерфейса, которые устанавливают изображение в UIImageView)
Для этого потребуется дополнительная инфраструктура. Как, например, схема уведомлений или наблюдение за ключевыми значениями.
Ответ 3 · Mihai Damian
Вы не можете. imageWithContentsOfFile: всегда будет загружать изображение из файла (хотя и лениво). Что вы можете сделать, так это создать собственный кеш в памяти с помощью NSArrays или NSDictionaries, в зависимости от того, как вы хотите выполнять поиск.