setImage для UIImageView в uitableviewcell задерживает прокрутку в iOS - PullRequest
2 голосов
/ 06 февраля 2012

У меня есть вид галереи фотографий, которые загружаются из Интернета, поэтому я использовал 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 без задержки прокрутки?

Примечание. Размер JPG составляет около 50 КБ

Спасибо

Ответы [ 2 ]

0 голосов
/ 20 апреля 2012

Из того, что я понимаю, все шаги, необходимые для запуска асинхронного запроса к диску, занимают пару миллисекунд для основной нити, и этого времени достаточно для того, чтобы прокрутка выглядела как заикающаяся, поэтому я решил полностью удалить кэширование жесткого диска длябольшие изображения и вместо этого создайте NSMutableDictionary, который содержит UIImage в качестве объекта и NSURL.absoluteString в качестве ключа.Это работает без проблем, но, очевидно, имеет недостаток, заключающийся в том, чтобы быть боровом памяти.Я проверил использование памяти некоторыми приложениями для обмена фотографиями, и мне удалось довести объем памяти приложения до более чем 100 МБ, так что, похоже, все остальные делают это.

0 голосов
/ 06 февраля 2012
  1. Создайте подкласс uitableViewCell и сделайте свое собственное рисование в drawContentView.
  2. Измените размеры изображений в фоновом потоке и затем представьте их в ячейках.

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

...