2012-06-29 4 views
2

В настоящее время я интегрирую Facebook в свое приложение, и сейчас я нахожусь в точке, где загружаю фотографии профиля друзей пользователя loggedin. Я представляю этих пользователей в UITableView, в каждой ячейке - изображение и имя друга. Я подклассифицировал UIImageView и когда соответствующая ячейка обрабатывается в методе cellForView, изображение загружается асинхронно.Загрузка асинхронного изображения в uitableview

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

Есть ли кто-нибудь, кто может помочь мне с этой проблемой и дать мне решение?

Заранее благодарен!

+0

Не могли бы вы поделиться кодом, в котором вы устанавливаете изображения? Существует гораздо лучший способ сделать это, чем повторное использование ячеек! – hypercrypt

+0

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

ответ

0

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

Еще одна вещь, на которую нужно обратить внимание - это размер файла изображений. Скорее всего, они больше размера, на котором вы на самом деле показываете их. Если есть способ получить меньшую версию, это определенно поможет.

В-третьих, вы можете установить для изображения изображение по умолчанию в tableView:willDisplayCell:forRowAtIndexPath. Мерцание, вероятно, все еще произойдет, но с изображением по умолчанию, которое выглядит лучше, чем если бы это была чужая картина. На самом деле, я думаю, что это то, что делает приложение Facebook.

+0

Благодарим за отзыв. Я работаю сейчас, не повторно используя ячейки :) – Devos50

+3

Вы действительно должны использовать ячейки! – hypercrypt

0

Когда ячейка скрывается, она удаляется с tableView. Таким образом, вы можете переопределить в вашем UITableViewCell производного метода класса willMoveToSuperview:

- (void)willMoveToSuperview:(UIView *)newSuperview 
{ 
    [super willMoveToSuperview:newSuperview]; 
    if(newSuperview == nil) { 
     // Stop image downloading 
    } 
} 
+0

Благодарим вас за ответ. Я попытался реализовать это, но он работал не очень хорошо, у меня была та же проблема, что и раньше;) – Devos50

4

Вы можете уволить любое загруженное изображение (а также текущие операции загрузки, если есть один) в
- (void)prepareForReuse method of UITableViewCell.

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

+0

, пожалуйста, более подробно, что мне нужно сделать в методе prepareForReuse? – Kasihasi

+1

Вы должны отменить операцию загрузки изображения и очистить представление изображения (например, присвоить ему нуль или какой-либо заполнитель). В ios6 вы также можете использовать tableView: didEndDisplayingCell: forRowAtIndexPath: метод. – note173

Смежные вопросы