2009-11-10 3 views
1

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

Это ПОЛНОСТЬЮ отлично, но у меня есть эта странная проблема.

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

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

ФАКТИЧЕСКИЙ ФАКТ: когда я прокручиваю назад кверху, теперь 5 или 6 ячеек загружаются идеально.

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

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

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

Таким образом, метод loadimage вызывается. Но не получать данные.

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

ответ

0

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

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

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

1

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

Implement a kind of white board on Iphone

0

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

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

0

Спасибо Тим, Скирван и Голландия! Я нашел проблему. Теперь это так очевидно, omg! Я просто смотрел не туда!

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

1

Заканчивать HJCache, который сделан, чтобы сделать эту проблему легко, она обеспечивает полное управление asynchrounous загрузки изображений, совместное использование объектов UIImage и кэш файлов, которые можно настроить и может очиститься: HJCache: iPhone cache library for asynchronous image loading and caching

Смежные вопросы