Делает блок NSURLConnection основной поток / поток UI

Я загружаю изображения в ячейках табличного представления, поскольку они прокручивают на экран. По причинам UX я начинаю загружать изображения в - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath. Я не ожидаю, пока табличное представление не сделано, прокрутив. Когда ячейка табличного представления установлена, я начинаю загружать изображения, которые я уже не имею. Однако они, кажется, полностью не загружают, пока табличное представление не прекращает перемещаться. Как только это прекращает перемещаться, изображения почти загружают немедленно.

Там должен так или иначе использовать NSURLConnection, где он не заблокирован основным потоком UI? Или, есть ли путь, где эти изображения загрузят очень быстро, в то время как табличное представление прокручивается.

** РЕДАКТИРОВАНИЕ **

Чтобы доказать, что NSURLConnection медленнее, я использовал NSThread для отсоединения нового селектора в другом потоке. Я затем загружаю данные и перезваниваю к основному потоку, где я создаю UIImage и показываю его в табличном представлении. Этот метод работает НАМНОГО быстрее.

Лично, я думаю, что NSURLConnection становится брошенным в цикл событий, где UITableView, прокручивающий, блокирует его.

6
задан rickharrison 13 July 2010 в 04:48
поделиться

3 ответа

Я уже сталкивался с этой проблемой. Асинхронные методы делегата NSURLConnection не срабатывают во время прокрутки scrollView. Хотя загрузка работает в фоновом режиме, ваш основной поток не информируется о новых изображениях. Как и вы, я считаю, что проблема связана с прокруткой scrollviews во внутреннем NSRunLoop с другим RunLoopMode. Я говорил об этом с сотрудниками Apple и попросил их посмотреть на мой код, но мы не смогли найти решение.

С другой стороны, у Джеффа ЛаМарша есть этот пост в его блоге, где он делает то же самое, и это работает, как ожидалось. Я не смог понять, что он делает по-другому (в основном из-за отсутствия времени), но это может стоить внимания.

2
ответ дан 8 December 2019 в 04:51
поделиться

Если вы имеете в виду «выполняется ли NSURLConnection в основном потоке?», То да, я считаю, что это так. Соединение открывается, и методы делегата выполняются в основном потоке. Я не нашел никакой документации, чтобы предположить иное, и вы можете проверить это путем отладки.

Я думаю, что ваше предположение о том, что прокрутка UITableView блокирует обратные вызовы NSURLConnection в основном цикле выполнения, является правильным.

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

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

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

1
ответ дан 8 December 2019 в 04:51
поделиться

Похоже, вы выполняете синхронную загрузку.

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-170129

Прочтите и сделайте убедитесь, что вы используете асинхронные API

-1
ответ дан 8 December 2019 в 04:51
поделиться