2010-03-15 2 views
1

Я развиваюсь на iPhone, и я видел в AppStore, что изображения постепенно загружаются в UITableView ... Как это реализовать? Моя идея состояла в том, чтобы обнаружить показанный контент (какие ячейки показаны) и загрузить эти изображения. Моя проблема в том, что я не знаю, как обнаружить показанные клетки! Это хороший способ сделать это?Прогрессивная загрузка изображений в UITableView

Лучшие

ответ

3

Как это было продемонстрировано на iPhone Developer Tech Talk, чтобы использовать NSOperation и NSOperationQueue.

Идея заключается в том, чтобы обернуть запрос загрузки изображения (используя NSURLRequest) в NSOperation.

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

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

Очередь начинает выполнение операций и обращается к каждой соте, когда они будут выполнены.

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

+0

Моя проблема заключается в том, как я обнаруживаю ячейки, которые отображаются? – ncohen

+0

Ячейка отображается после вызова метода tableView: cellForRowAtIndexPath: ', поскольку это метод, который предоставляет представление таблицы для отображения ячейки. В подклассе вашей ячейки есть метод, который создает NSOperation, который инкапсулирует загрузку изображения и добавляет его в NSOperationQueue, управляемый вашим контроллером табличного представления или где-то еще в вашем приложении. – Jasarien

+0

, когда я говорю дисплей, я имею в виду видимый на экране ... Если вы посмотрите на appstore, то только когда прокрутка просмотрела прокрутку, что изображения загружены! Как я могу определить отображаемые ячейки? – ncohen

0

@Jasarien: хороший ответ

Или вы можете использовать проект Three20, если вы хотите. есть TTTableViewController, который уже обрабатывает все необходимое. вам нужно только ввести URL-адрес в изображение и альт.

TT также кэширует ваши изображения в памяти или также на диске.

проверьте образец проекта в комплекте с тремя gitbub ressource. есть пример.

+0

Спасибо, но я уже сделал большую часть ... не хотите перезапустить! – ncohen

+1

320 отлично, если вы планируете использовать много того, что он предлагает, а потому, что все, что связано с Three20, настолько тесно связано с материалом TTStyle, что приносит много накладных расходов, если вы хотите использовать только одну или две функции. – Jasarien

1

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

+0

спасибо, но все еще есть проблема знать, какая ячейка видна на экране! – ncohen

+0

Это отличное расширение для UIImageView (желательно, я думал об этом сам;)), но это совсем другой подход к описанному мной методу NSOperation. Это превосходно для использования с UIImageViews, но в некоторых случаях, особенно в тех случаях, когда вы хотите, чтобы ячейки, которые прокручивались очень быстро, использование UIImageView может вызвать слишком много перетаскивания производительности, имея богатую иерархию представлений. В этих случаях имеет смысл использовать многопоточный подход. – Jasarien

1

Я бы использовал каждую ячейку в качестве подкласса UITableViewCell, а затем переопределял willMoveToWindow: method в подклассе. willMoveToWindow: вызывается, когда вид ячейки становится видимым на экране или когда он выключается (newWindow получает нуль). Затем каждая ячейка может поставить в очередь запрос на загрузку своего изображения, когда оно станет видимым (и, возможно, даже отменит его запрос в очереди, если он отключится от экрана).

BTW, вы можете использовать visibleCells property UITableView, чтобы получить список видимых ячеек.

+0

Thx visibleCell был именно тем, что я искал! – ncohen

0

Пожалуйста, перейдите по этой ссылке, и попытаться интегрировать Ленивые нагрузки просмотра таблицы, вы можете достигнуть вас выход, http://www.cocoaintheshell.com/2011/05/progressive-images-download-imageio/ изменить url в ProgressiveImageDownloadViewController в режиме загрузки.

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