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 МБ, так что, похоже, все остальные делают это.

  1. Подкласс uitableViewCell и сделать свое собственное дроу в drawContentView.
  2. Изменить размер изображения в фоновом потоке, а затем представить их в ячейках.

PS: если код, найденный в git hub, недостаточно хорош для вас, попробуйте написать свой, который соответствует вашей проблеме.

Другие вопросы по тегам