Какова основная идея того, как большие приложения, содержащие много изображений (особенно в представлении таблицы или коллекции), управляют кэшированием с выделенными ячейками? Никто не ответил на мой предыдущий вопрос об этом iOS Memory Warnings, и я пытаюсь заполнить коллекционный вид более 100 изображениями из Parse. После того, как вы не нашли подходящего решения с ручным кодом и уменьшили мои изображения до низкого качества, я попробовал несколько разных библиотек, включая SDWebImage, LRImageManager, Haneke и PINRemoteImage. Я просто хочу получить хорошую идею или подход к решению проблемы управления памятью моего приложения. Как другие приложения могут загружать сотни «хороших» качественных фотографий в режиме просмотра, доступном для декуляции? Это ракетостроение?Управление памятью в приложениях с большими изображениями
ответ
Ответ - это комбинация вещей. Не загружайте все изображения в память одновременно. Сохраните их как файлы в каталоге документов или кэшей и загрузите их для каждой ячейки в cellForRowAtIndexPath и просто отбросьте изображение в памяти, когда пользователь прокручивает его за кадром.
Кроме того, не загружайте большое изображение в виде миниатюры. Вместо этого, когда вы его загрузите, сразу же создайте версию уменьшенного изображения с целевым размером экрана и сохраните его (И оригинальной версии, если вам это нужно.) Затем вы можете загружать и отображать миниатюры с гораздо меньшим воздействием памяти. Поскольку вы создаете миниатюры для определенного устройства, вы можете создать только необходимый размер миниатюры (сетчатка или не сетчатка, размер для экрана на текущем устройстве. {IPad/4 "телефон, 5-дюймовый телефон, iPhone 6 , 6+ и т. Д.})
Вы должны правильно настроить кеш памяти (например, NSCache), который сохранит изображения, размер которых будет изменен для их отображаемого размера, что подходит как для памяти, так и для drawing performance. Вот a tutorial о том, как настроить NSCache для хранения изображений. И это именно то, что делает DFImageManager.
let targetSize = CGSize(width: 100, height: 100)
let request = DFImageRequest(resource: imageURL, targetSize: targetSize, contentMode: .AspectFill, options: nil)
let task = DFImageManager.imageTaskForRequest(request) { (image, _, _, _) -> Void in
// Image is resized to fill 100x100 px target size
// Image is stored into mem cache, next request would finish synchronously
var fetchedImage = image
}.resume()
// NSURLSession stores original data into NSURLCache
- 1. Управление большими слияниями/памятью
- 2. Управление памятью и большими файлами Linux
- 3. Управление памятью изображений в Android
- 4. Управление памятью с флэш-памятью
- 5. iCarousel с большими изображениями перекрывает
- 6. Canvas drawImage с большими изображениями
- 7. Throwing OutOfMemoryError с большими изображениями
- 8. Быстрая анимация с большими изображениями
- 9. Анимация с несколькими большими изображениями
- 10. Почему ручное управление памятью?
- 11. Apache Spark - Управление памятью
- 12. Управление памятью локального объекта
- 13. Эффективное управление памятью в R
- 14. Управление флеш-памятью SoundChannel и управление памятью
- 15. Управление памятью на С ++
- 16. Управление памятью
- 17. Управление памятью с кодом
- 18. Управление памятью
- 19. Как работать с большими изображениями в iOS?
- 20. Управление памятью с делегатами?
- 21. Управление памятью
- 22. Управление памятью
- 23. Проблема с большими массивами PHP с памятью
- 24. Проблема с памятью с большими NSData
- 25. Проблемы с памятью RNCryptor с большими файлами
- 26. Управление памятью
- 27. Управление памятью
- 28. Управление изображениями?
- 29. Управление памятью для приложений с интенсивной памятью
- 30. Управление памятью и памятью с помощью pcap
Я согласен с тем, что вы сказали. Я использую dequue-able ячейки, поэтому я определенно не загружаю все мои изображения сразу. Я также значительно улучшил производительность, уменьшив масштаб моих изображений, прежде чем загружать их в базу данных Parse. Но когда дело доходит до получения их из базы данных, я не знаю, как можно уменьшить их. Я связал свой код с исходным вопросом, и вы можете видеть, что я использую кеш для хранения изображений, которые не отображаются на экране. Тем не менее, я начинаю получать предупреждения о памяти, когда я начинаю заполнять кеш (к которому я тогда очищаю кеш), и мое приложение в конечном итоге падает. –
Не загружайте изображения в кеш. Храните их в файлах на диске, а затем загружайте их из каждого файла. Это значительно сократит объем памяти. Что касается их сокращения, создайте контекстный графический контекст нужного размера, сделайте изображение в этом целевом прямоугольнике, а затем прочитайте UIImage из полученного контекста. Дополнительную информацию см. В методе 'UIGraphicsBeginImageContextWithOptions' в документах Xcode. –
О, я не знал о хранении данных изображения в файлах на диске. Похоже, что много нового, чтобы учиться, но кажется полезным. Спасибо за совет :) –