UITableView проблема с асинхронной загрузкой изображений - PullRequest
1 голос
/ 10 ноября 2009

Так что это моя проблема: У меня есть UITableView с пользовательскими UITableViewCells. Каждая из ячеек имеет один UIImageView, который загружает удаленное изображение, используя асинхронную загрузку изображения.

Он работает ПОЧТИ идеально, но у меня есть эта странная проблема.

Когда представление загружено, я вижу 5 или 6 первых ячеек без прокрутки (высота экрана iPhone).

Проблема в том, что изображение каждой ячейки не появляется в данный момент. Прокручивая стол до дна, ячейки # 7 ~ end отлично загружаются.

Странный факт: когда я прокручиваю назад наверх, теперь 5 или 6 ячеек загружаются идеально.

Моей первой мыслью было: при загрузке представления метод cellForRowAtIndexPath не вызывал метод loadimage для первых ячеек сразу после взаимодействия с пользователем.

Но используя NSLog (шаг за шагом), чтобы найти, где проблема, дело в том:

  1. cellForRowAtIndexPath вызывает метод loadimage
  2. внутри метода loadimage создается NSURLConnection
  3. NSURLConnection didReceiveData метод не вызывается

Итак, метод loadimage вызывается, действительно. Но не получаю данные.

Прокрутка до дна и затем возврат к верхним ячейкам, все в порядке. Слово странно.

Ответы [ 5 ]

1 голос
/ 21 января 2011

Ознакомьтесь с HJCache, который облегчает эту проблему, он обеспечивает полное управление асинхронной загрузкой изображений, общим доступом к объектам UIImage и файловым кешем, который можно настроить и очистить самостоятельно: HJCache: кэш iPhone библиотека для асинхронной загрузки и кэширования изображений

1 голос
/ 11 ноября 2009

Вы можете попробовать использовать мой объект JImage, который точно такой же, как UIImageView, но ему передается URL вместо пути к файлу. Во время загрузки изображения (полная асинхронность) отображается индикатор активности. Используйте его так же, как UIImageView, но инициализируйте его с помощью URL.

Реализация своего рода белой доски на Iphone

0 голосов
/ 12 ноября 2009

Спасибо Тиму, Скирвану и Голландке! Я нашел проблему. Это так очевидно сейчас, боже мой! Я просто смотрел не на то место!

Данные для UITableView поступают из XML. После анализа я вызываю reloadData. Чего я раньше не видел, так это того, что все методы этого процесса обрабатываются внутри NSAutoreleasePool. Итак, когда он заканчивается (довольно быстро), все исчезает (и у NSURLConnection не хватает времени для загрузки изображения).

0 голосов
/ 11 ноября 2009

Наиболее вероятным объяснением является то, что асинхронный вызов занимает слишком много времени; если он не вернулся до того, как ячейка была нарисована, ваша ячейка будет рисовать без нее и никогда не перерисовывается, пока ее не прокрутят с экрана и не вернут обратно.

Вы можете либо загружать изображения синхронно до того, как ваши ячейки будут в первый раз прорисованы (что, вероятно, не то, что вам нужно, так как это повредит отзывчивость интерфейса), либо вы можете добавить некоторый код в ваш обработчик connectionDidFinishLoading: который пометит таблицу как нужную повторно отобразить ячейки для только что загруженного изображения.

0 голосов
/ 10 ноября 2009

Вы говорите, что NSURLConnection создано, но вы никогда не говорите, что оно начинается. Убедитесь, что вы вызываете один из методов, запускающих соединение (initWithRequest:delegate:startImmediately: или start).

Если это не ваша проблема, то можете ли вы проверить, были ли вызваны какие-либо другие методы делегата NSURLConnection? Обратите особое внимание на connection:didFailWithError:, так как может возникнуть какая-то странная процедура запуска сети, которая должна произойти до того, как ваши соединения заработают, что приведет к их отказу при первой загрузке, но не позже.

Наконец, вы можете проверить, работает ли он, когда отправляете табличному представлению сообщение reloadData? Что-то вроде [tableView performSelector:@selector(reloadData) withObject:nil afterDelay:1.0];, так что оно перезагружается после секундного ожидания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...