Обработка памяти для миниатюрных изображений в UITableViewCells - PullRequest
2 голосов
/ 19 февраля 2012

Краткое объяснение

В настоящее время у меня есть UITableView, который содержит ячейки видео с веб-сайта.Кроме того, каждая ячейка (которая представляет видео) имеет определенное уменьшенное изображение.Эти изображения загружаются асинхронно с помощью NSURLConnection (поэтому мне не нужно беспокоиться о потоке самостоятельно).Когда эти объекты изображений загружены, они просто уведомляют UITableView, чтобы обновить ячейку, к которой он принадлежит.

Моя проблема

Как стандарт, в каждый вызов UITableView будет добавляться 10 новых видео.Это означает, что пользователю разрешено выдвигать ячейку внизу UITableView, чтобы запросить 10 новых видео и так далее.Проблема здесь в том, что быстро будет очень много использования памяти, потому что данные для всех миниатюрных изображений (в UITableView) все равно будут существовать, несмотря ни на что.

Есть ли разумный способ, которым вы можете определитьвыделить объекты изображения, которые в данный момент не отображаются?

Кроме того, UITableView просто отображает все свои ячейки непосредственно из массива всех моих видеообъектов, когда-либо полученных с веб-сайта.Это означает, что нет никаких ограничений относительно того, сколько раз пользователь может запрашивать новые видео, что делает этот массив все больше и больше.Правильно ли хранить такие массивы в памяти все время?Или вы должны вместо этого удалить те, которые выходят из поля зрения, и запросить их позже?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 19 февраля 2012

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

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

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

0 голосов
/ 19 февраля 2012

Если вы создаете свой собственный класс VideoTableViewCell в качестве подкласса UITableViewCell, и вы даете своей ячейке свойство для изображения, это изображение будет выпущено, как только ячейка исчезнет с экрана. Ячейка и изображение будут воссозданы, как только ячейка вернется в вид.

Для видео я бы сохранял все загруженные видеофайлы в папке документов и сохранял там URL в массиве. Если ячейка видна или нажата, просто загрузите файл с жесткого диска.

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