Форум программистов, компьютерный форум, киберфорум
Наши страницы
Objective-C
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
1

Как сделать асинхронную загрузку картинок в UITableView не останавливая главный поток?

27.10.2014, 13:03. Просмотров 1617. Ответов 3
Метки нет (Все метки)

Точнее как показать асинхронно загруженные картинки не останавливая главный поток?

Есть UITableViewController, по мере появления ячеек на экране в фоновом потоке загружаются картинки.
Как только картинка загружена надо показать её на экране, если сделать это в фоновом потоке, она не появляется, а если в главном, то это останавливает прокрутку.

Есть способ изменить UIView внутри ячейки таблицы не останавливая главный поток?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2014, 13:03
Ответы с готовыми решениями:

Как сделать последовательную загрузку картинок в разные Image без повторения предыдущих?
Пишу игру 21(очко) и стала задача заливать в Image нужную карту из моей папки с...

Как передать данные из дочерного потока в главный поток
Здравствуйте. Искал по форуму есть похожие темы но нет решения. Есть класс...

Как остановить главный поток до момента выполнения определенного события?
Подскажите как остановить главный поток до момента выполнения определенного...

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

Как определить загрузку всех 100% картинок и только потом выполнить функцию?
$.post('./Controllers/Index/Resize', {src: img.src}, (function (data) { ...

3
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
27.10.2014, 13:18 2
vitalik_a, вызывайте метот кствки картинки в главном потоке, после загрузки картинки в побочном
0
Melzas
38 / 38 / 6
Регистрация: 20.07.2011
Сообщений: 88
27.10.2014, 13:41 3
Цитата Сообщение от vitalik_a Посмотреть сообщение
а если в главном, то это останавливает прокрутку
Что значит останавливает прокрутку? Ничего подобного происходить не должно.

Что именно сейчас делается в главном потоке? По хорошему на ячейке должна лежать UIImageView (поверх обычно кладут UIActivityIndicatorView). В главном потоке просто устанавливается imageView.image, а UIActivityIndicatorView убирается.
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
27.10.2014, 16:25  [ТС] 4
Objective-C
1
В главном потоке просто устанавливается imageView.image, а UIActivityIndicatorView убирается.
наверное я не правильно переходил между потоками

в контроллере табличного вида для каждой ячейки я создавал объект модели TeaserItemNewsModel (модель тизера новости) и вызывал метод loadImage

в методе loadImage делал вызов метода в фоновом потоке:
Objective-C
1
[self performSelectorInBackground:@selector(loadImageInBackground) withObject:nil];
в loadImageInBackground синхронный запрос
Objective-C
1
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
и отправку сообщения контроллеру табличного вида о том что картинка загружена
Objective-C
1
[[NSNotificationCenter defaultCenter] postNotificationName:TEASER_ITEM_IMAGE_LOADED_NOTIFICATION object:self];
и контроллер табличного вида услышав сообщение о загрузке картинки должен был отобразить её
до сих пор я для этого использовал:
Objective-C
1
        dispatch_async(dispatch_get_main_queue(), ^{[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:teaserItemNewsModel.indexPath] withRowAnimation:UITableViewRowAnimationNone];});
вот здесь и происходили подёргивания таблицы про скроллинге

Добавлено через 9 минут
сейчас я закомментировал весь приведённый код и в месте где картинка вставляется в UIImageView при формировании ячейки и прямо там сделал асинхронный запрос и вставку картинки
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (image == nil)
{
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:self.imageUrl
                                                    cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                                                timeoutInterval:30.0];
    [NSURLConnection sendAsynchronousRequest:urlRequest
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
    {
        self.newsImageView.image = [UIImage imageWithData:data];
    }];
}
else
{
    self.newsImageView.image = image;
}
сейчас кажеться работает без подергиваний
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2014, 16:25

Главный поток и вторичный
1. При нажатии на кнопку Start в новом потоке запускается...

Дополнительный поток тормозит главный
Всем здравствуйте. Вот код, использующий работу нескольких потоков: ...

BackgroundWorker блокирует главный поток
Подскажите как поправить. Код копирует файлы отмеченные галочками в ListView,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru