setImage для UIImageView в uitableviewcell задерживает прокрутку в iOS
У меня есть просмотр галереи фотографий, которые загружаются из Интернета, поэтому я использовал EGOImageView от Enormego. Я заметил, что когда я прокручивал таблицу вниз после того, как изображения были в кеше, прокрутка зависала. Я сразу обнаружил, что когда изображение было получено с жесткого диска с return [UIImage imageWithContentsOfFile:cachePathForKey(key)];
он работал в основном потоке, поэтому я добавил операцию в NSOperationQueue. Это уменьшило отставание вдвое, но прокрутка все еще заикалась. Пройдя через код, я заметил, что в методе успеха
- (void)imageLoaderDidLoad:(NSNotification*)notification {
if(![[[notification userInfo] objectForKey:@"imageURL"] isEqual:self.imageURL]) return;
UIImage* anImage = [[notification userInfo] objectForKey:@"image"];
self.image = anImage;
[self setNeedsDisplay];
if([self.delegate respondsToSelector:@selector(imageViewLoadedImage:)]) {
[self.delegate imageViewLoadedImage:self];
}
}
комментируя self.image = anImage;
полностью избавился от лага (но, очевидно, у меня нет изображения). И, насколько я могу судить, если я хочу изменить пользовательский интерфейс, это должно быть сделано в главном потоке. Есть ли способ установить изображение для EGOImageView без задержки прокрутки?
Примечание: JPGs около 50 КБ
Спасибо
2 ответа
Из того, что я понимаю, все шаги, необходимые для инициализации асинхронного запроса к диску, занимают пару миллисекунд для основной нити, и этого времени достаточно, чтобы прокрутка выглядела как заикающаяся, поэтому я решил полностью удалить кэширование жесткого диска для больших изображений и вместо этого создайте NSMutableDictionary, который содержит UIImage как объект, и NSURL.absoluteString в качестве ключа. Это работает без проблем, но, очевидно, имеет недостаток, заключающийся в том, чтобы быть боровом памяти. Я проверил использование памяти некоторыми приложениями для обмена фотографиями, и мне удалось довести использование памяти для приложения до более чем 100 МБ, так что, похоже, все остальные делают это.
- Подкласс uitableViewCell и сделать свое собственное дроу в drawContentView.
- Изменить размер изображения в фоновом потоке, а затем представить их в ячейках.
PS: если код, найденный в git hub, недостаточно хорош для вас, попробуйте написать свой, который соответствует вашей проблеме.