Я загружаю изображения в ячейках табличного представления, поскольку они прокручивают на экран. По причинам UX я начинаю загружать изображения в - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
. Я не ожидаю, пока табличное представление не сделано, прокрутив. Когда ячейка табличного представления установлена, я начинаю загружать изображения, которые я уже не имею. Однако они, кажется, полностью не загружают, пока табличное представление не прекращает перемещаться. Как только это прекращает перемещаться, изображения почти загружают немедленно.
Там должен так или иначе использовать NSURLConnection, где он не заблокирован основным потоком UI? Или, есть ли путь, где эти изображения загрузят очень быстро, в то время как табличное представление прокручивается.
** РЕДАКТИРОВАНИЕ **
Чтобы доказать, что NSURLConnection медленнее, я использовал NSThread для отсоединения нового селектора в другом потоке. Я затем загружаю данные и перезваниваю к основному потоку, где я создаю UIImage и показываю его в табличном представлении. Этот метод работает НАМНОГО быстрее.
Лично, я думаю, что NSURLConnection становится брошенным в цикл событий, где UITableView, прокручивающий, блокирует его.
Я уже сталкивался с этой проблемой. Асинхронные методы делегата NSURLConnection не срабатывают во время прокрутки scrollView. Хотя загрузка работает в фоновом режиме, ваш основной поток не информируется о новых изображениях. Как и вы, я считаю, что проблема связана с прокруткой scrollviews во внутреннем NSRunLoop с другим RunLoopMode. Я говорил об этом с сотрудниками Apple и попросил их посмотреть на мой код, но мы не смогли найти решение.
С другой стороны, у Джеффа ЛаМарша есть этот пост в его блоге, где он делает то же самое, и это работает, как ожидалось. Я не смог понять, что он делает по-другому (в основном из-за отсутствия времени), но это может стоить внимания.
Если вы имеете в виду «выполняется ли NSURLConnection в основном потоке?», То да, я считаю, что это так. Соединение открывается, и методы делегата выполняются в основном потоке. Я не нашел никакой документации, чтобы предположить иное, и вы можете проверить это путем отладки.
Я думаю, что ваше предположение о том, что прокрутка UITableView блокирует обратные вызовы NSURLConnection в основном цикле выполнения, является правильным.
Вы уже опубликовали одно решение, порождающее ветку для вашего селектора. Другой альтернативой может быть выполнение ваших загрузок как NSOperations, что дает несколько преимуществ:
Подход Дэйва Дрибина, который я использую, заставляет соединения выполняться обратно в основном потоке, но это, вероятно, не обязательно для ваших целей - вы можете использовать свой текущий подход для обратного вызова основного потока после ваших изображений. скачать.
Похоже, вы выполняете синхронную загрузку.
Прочтите и сделайте убедитесь, что вы используете асинхронные API