UIImage в таблице прокрутки замедлений в uitableViewcell - PullRequest
0 голосов
/ 30 апреля 2011

Я загружаю изображение с данными в виде таблицы.Изображения приходят из сети.Я создал метод для получения URL-адреса изображения в классе модели. Класс модели содержит Nsdictionary и объекты.Но эта картинка замедляет прокрутку. Вот мой код

UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",
                                                                                        [(Tweet *)[recentTweets objectAtIndex:indexPath.row]urlString]]]]];
cell.imageView.image = image;

Скажите, пожалуйста, где я ошибаюсь?

Ответы [ 5 ]

2 голосов
/ 30 апреля 2011

Есть несколько способов, как это сделать. У меня был лучший опыт работы с очередью запросов Http, которую я приостанавливаю во время процесса прокрутки.

Я настоятельно рекомендую эту структуру для этого: http://allseeing -i.com / ASIHTTPRequest /

Я также реализовал кэш изображений, который загружает изображения, только если их не было в кэше.

И последний трюк состоял в том, чтобы на самом деле рисовать изображения вместо использования высокоуровневого компонента, такого как UIImageView

2 голосов
/ 30 апреля 2011

вот методология, которую я использую для загрузки изображений в UITableView из удаленного местоположения:

в вашем .h файле объявите изменяемый словарь для хранения изображений:

 NSMutableDictionary *images; 

инициализировать словарь в -init ... или в -viewDidLoad

images = [[NSMutableDictionary alloc]init];

в .m, tableView:cellForRowAtIndexPath:, посмотрите, существует ли изображение в вашем словаре для indexPath

UIImage *img = [images objectForKey: indexPath];

если изображение существует, просто установите его.

if (img) cell.imageView.image = img;

если изображение НЕ существует, установите для изображения ячейки временное изображение ...

if (!img) cell.imageView.image = [UIImage imageNamed:@"imageUnavailable.png"];

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

[images setObject:[UIImage imageNamed:@"imageUnvailable.png"] forKey: indexPath];

затем в этом же блоке используйте NSOperationQueue и пользовательскую NSOperation (здесь ссылка - NSOperation and SetImage ), чтобы получить ваше изображение и перезвонить в ваш UITableViewController с этим изображением.

в вашем обратном вызове добавьте ваше изображение в словарь (перезаписывая временное изображение) и вызовите [tableView reloadData]

это даст вам хороший не блокирующий пользовательский опыт.

2 голосов
/ 30 апреля 2011

Используйте Ленивый Загрузка и сделать свой собственный рисунок .Попытайтесь понять методы примеров проектов, которые я связал.Это лучшие способы улучшить производительность таблиц с изображениями.

1 голос
/ 30 апреля 2011

Первая причина, по которой ваш код работает медленно, заключается в том, что вы выполняете сетевой вызов в главном потоке.Это блокирует обновление пользовательского интерфейса и предотвращает обработку ОС событиями (например, касаниями).

Как уже предлагалось, я рекомендую ASIHTTPRequest.Объедините асинхронные запросы с NSOperationQueue с меньшим числом параллелизма (скажем, 2) для запросов изображений, кэширования и перезагрузки строк, когда изображения поступают (в основной поток) (также только перезагрузка строки, если она видна в данный момент).Вы можете получить плавное представление таблицы прокрутки.

У меня есть пример этого на github здесь: https://github.com/subdigital/iphonedevcon-boston

Он находится в проекте эффективного сетевого программирования и включает ряд проектов, которые постепенно улучшаютсяопыт.

0 голосов
/ 30 апреля 2011

Загрузите изображения перед загрузкой tableView и сохраните их в NSArray.Затем, когда вызывается метод cellForRowAtIndexPath, показывайте загружаемое изображение, пока оно не окажется в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...