2015-08-11 6 views
1

Какова основная идея того, как большие приложения, содержащие много изображений (особенно в представлении таблицы или коллекции), управляют кэшированием с выделенными ячейками? Никто не ответил на мой предыдущий вопрос об этом iOS Memory Warnings, и я пытаюсь заполнить коллекционный вид более 100 изображениями из Parse. После того, как вы не нашли подходящего решения с ручным кодом и уменьшили мои изображения до низкого качества, я попробовал несколько разных библиотек, включая SDWebImage, LRImageManager, Haneke и PINRemoteImage. Я просто хочу получить хорошую идею или подход к решению проблемы управления памятью моего приложения. Как другие приложения могут загружать сотни «хороших» качественных фотографий в режиме просмотра, доступном для декуляции? Это ракетостроение?Управление памятью в приложениях с большими изображениями

ответ

1

Ответ - это комбинация вещей. Не загружайте все изображения в память одновременно. Сохраните их как файлы в каталоге документов или кэшей и загрузите их для каждой ячейки в cellForRowAtIndexPath и просто отбросьте изображение в памяти, когда пользователь прокручивает его за кадром.

Кроме того, не загружайте большое изображение в виде миниатюры. Вместо этого, когда вы его загрузите, сразу же создайте версию уменьшенного изображения с целевым размером экрана и сохраните его (И оригинальной версии, если вам это нужно.) Затем вы можете загружать и отображать миниатюры с гораздо меньшим воздействием памяти. Поскольку вы создаете миниатюры для определенного устройства, вы можете создать только необходимый размер миниатюры (сетчатка или не сетчатка, размер для экрана на текущем устройстве. {IPad/4 "телефон, 5-дюймовый телефон, iPhone 6 , 6+ и т. Д.})

+0

Я согласен с тем, что вы сказали. Я использую dequue-able ячейки, поэтому я определенно не загружаю все мои изображения сразу. Я также значительно улучшил производительность, уменьшив масштаб моих изображений, прежде чем загружать их в базу данных Parse. Но когда дело доходит до получения их из базы данных, я не знаю, как можно уменьшить их. Я связал свой код с исходным вопросом, и вы можете видеть, что я использую кеш для хранения изображений, которые не отображаются на экране. Тем не менее, я начинаю получать предупреждения о памяти, когда я начинаю заполнять кеш (к которому я тогда очищаю кеш), и мое приложение в конечном итоге падает. –

+0

Не загружайте изображения в кеш. Храните их в файлах на диске, а затем загружайте их из каждого файла. Это значительно сократит объем памяти. Что касается их сокращения, создайте контекстный графический контекст нужного размера, сделайте изображение в этом целевом прямоугольнике, а затем прочитайте UIImage из полученного контекста. Дополнительную информацию см. В методе 'UIGraphicsBeginImageContextWithOptions' в документах Xcode. –

+0

О, я не знал о хранении данных изображения в файлах на диске. Похоже, что много нового, чтобы учиться, но кажется полезным. Спасибо за совет :) –

0

Вы должны правильно настроить кеш памяти (например, 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 
Смежные вопросы