Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
#1

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

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

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

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

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

Как сделать многоуровневую игру? Objective-C
Стандартный поток ввода и вывода в Objective-C Objective-C
Objective-C Как сделать, чтобы текст букв изменялся как в караоке?
Objective-C Дозагрузка данных в UITableView при скролле
Objective-C Загрузка картинок по ссылке из массива
Objective-C Загрузка картинок в ячейках TableView
Как наполнять UITableView ячейками разной высоты? Objective-C
Objective-C Как при дозагрузке данных показать UIActivityIndicatorView внизу UITableView?
Исчезает разделитель при скролле UITableView Objective-C
UITableView Section Objective-C
Как сделать пагинацию таблицы? Objective-C
Objective-C UITableView - footer не уходит за экран

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
27.10.2014, 13:18     Как сделать асинхронную загрузку картинок в UITableView не останавливая главный поток? #2
vitalik_a, вызывайте метот кствки картинки в главном потоке, после загрузки картинки в побочном
Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
27.10.2014, 13:41     Как сделать асинхронную загрузку картинок в UITableView не останавливая главный поток? #3
Цитата Сообщение от vitalik_a Посмотреть сообщение
а если в главном, то это останавливает прокрутку
Что значит останавливает прокрутку? Ничего подобного происходить не должно.

Что именно сейчас делается в главном потоке? По хорошему на ячейке должна лежать UIImageView (поверх обычно кладут UIActivityIndicatorView). В главном потоке просто устанавливается imageView.image, а UIActivityIndicatorView убирается.
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
27.10.2014, 16:25  [ТС]     Как сделать асинхронную загрузку картинок в UITableView не останавливая главный поток? #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;
}
сейчас кажеться работает без подергиваний
Yandex
Объявления
27.10.2014, 16:25     Как сделать асинхронную загрузку картинок в UITableView не останавливая главный поток?
Ответ Создать тему
Опции темы

Текущее время: 18:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru