Форум программистов, компьютерный форум 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. Просмотров 1372. Ответов 3
Метки нет (Все метки)

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

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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
27.10.2014, 13:18 #2
vitalik_a, вызывайте метот кствки картинки в главном потоке, после загрузки картинки в побочном
0
Melzas
38 / 38 / 4
Регистрация: 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
Привет! Вот еще темы с ответами:

Приостановить главный поток до закрытия формы - Java SE
В общем не могу понять, как сделать так, чтоб поток main тормозился, пока не закроется форма public class Client extends JFrame { ...

Получить результат из потока в главный поток - Java SE
Всем добрый вечер. Я только начинаю изучать многопоточность, столкнулся со следующей задачей: "Задана матрица действительных чисел. Найти...

как загрузить несколько BMP-картинок в поток - C++ Builder
Помагите пожалуйста, не могу разобраться с потоком, как загрузить несколько BMP-картинок в поток, и там потом их обсчитать, заранее спасибо

Главный поток ждет освобождения одного из двух семафоров - C++ WinAPI
Помогите товарищи! Дали лабораторную работу, вроде сделал, вроде работает, но преподаватель говорит что не верно, мол не освободил, а я не...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.10.2014, 16:25
Ответ Создать тему
Опции темы

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