Ленивые загрузки изображений в UITableViewCell
У меня есть около 50 пользовательских ячеек в UITableView. Я хочу отображать изображение и метку в ячейках, где я получаю изображения с URL-адресов.
Я хочу делать ленивую загрузку изображений, поэтому пользовательский интерфейс не замерзает во время загрузки изображений. Я попытался получить изображения в отдельных потоках, но я должен загружать каждое изображение каждый раз, когда ячейка снова становится видимой (в противном случае повторное использование ячеек показывает старые изображения)
Приложения, такие как Facebook, загружают изображения только для видимых в данный момент ячеек и после загрузки изображений они снова не загружаются. Может кто-нибудь, пожалуйста, скажите мне, как дублировать это поведение.
Спасибо.
<я > Изменитья >
Попытка кэширования изображений в объекте NSMutableDictionary создает проблемы, когда пользователь быстро прокручивается. Я получаю изображения только тогда, когда прокрутка полностью останавливается и очищает кеш памяти. Но приложение неизменно получает предупреждение о памяти (из-за размера кэшируемых изображений) и очищает кеш перед перезагрузкой. Если прокрутка выполняется очень быстро, он сработает.
Любые другие предложения приветствуются
Ответы
Ответ 1
Загрузка изображений в фоновый поток по-прежнему является хорошей идеей. Если вы не хотели их перезагружать каждый раз, я бы предложил создать NSMutableDictionary и сохранить изображения там. В качестве ключа для каждого изображения можно использовать уникальный идентификатор, например идентификатор строки или даже имя изображения.
При загрузке ячейки вы отправляете сообщение objectForKey: в NSMutableDictionary для получения изображения для этой конкретной ячейки (на основе вашего уникального ключа для нее). Если он возвращает nil, это означает, что изображение отсутствует в кеше, и вам понадобится поток загрузки фонового изображения, чтобы получить его. В противном случае вы вернете соответствующее изображение для отображаемой ячейки таблицы. В предупреждении о памяти вы можете очистить этот кеш изображений без каких-либо побочных эффектов (кроме того, чтобы снова их перезагрузить по требованию).
Ответ 2
Я только что успешно решил ту же проблему, используя пользовательский NSOperation для загрузки изображений в queing fasion и сохранил их в статическом NSMutableDictionary в качестве кеша. Ниже приведена ссылка на основу кода, который я использовал для решения проблемы.
Загрузка удаленных изображений для UITableViewCell
Лучше всего прочитать все темы на форуме, чтобы помочь вам понять, что происходит на самом деле.
Ответ 3
lostInTransit,
У меня есть аналогичная проблема, и, исследуя множество различных возможных решений, я нашел это сообщение в блоге:
davidgolightly.blogspot.com/2009/02/asynchronous-image-caching-with-iphone.html
Я также предлагаю вам загрузить образец URLCache с веб-сайта разработчика Apple:
developer.apple.com/iphone/prerelease/library/samplecode/URLCache/
И вот еще одно сообщение о проблеме:
www.markj.net/iphone-asynchronous-table-image/
Я хотел бы, чтобы вы также делились своими результатами.
Ответ 4
Для тех, кто заинтересован и ленив, как и я, я хотел бы предложить реализацию с открытым исходным кодом (лицензия MIT) ленивой/кэшированной сети изображений UIImageView: SDWebImage
Ответ 5
Ленивая загрузка похожа на синхронный запрос типа.. означает ждать ответа
Кнопка изображения эго - это решение для этого.
Кнопка изображения эго представляет собой запрос асинхронного типа. Не дожидайтесь ответа. Просто отобразите данные за раз.
вы можете скачать папку из github....
добавить в свой проект...
в xib..at изображение, изменить класс на кнопку изображения эго...
сделать его объектом в файле m...
вы можете использовать.....
Ответ 6
UITableView с кешированием изображений и изменением размера/настройкой в фоновом потоке:
http://blog.slaunchaman.com/2011/08/12/gcd-example-updated-now-with-more-speed/
Ответ 7
Это Учебник о NSOperation с примером, показывающим, как Lazy загружать изображения в UITableViewCell