iOS изображение [Зимородок || AlamofireImage] "Завершено из-за проблемы с памятью"
Так что мое приложение отображает только изображения в CollectionView, и оно падает из-за проблем с памятью. Это график памяти
Это пример проекта, который вы можете проверить. ImageTest
Я пробовал этот же проект с Kingfisher Library и AlamofireImage Library, и он вылетает на обоих.
1 ответ
Вероятно, проблема вызвана тем, что ваши изображения слишком велики. Я вижу два решения.
PINRemoteImage
Попробуйте использовать PINRemoteImage. Это в ObjC, но вы можете соединиться со Swift. Эта структура позволяет вам устанавливать ограничения на размер кеша, что должно препятствовать сбору вашей памяти.
Тем не менее, это может не помочь, потому что у вас могут оказаться не все ваши изображения.
Уменьшить изображения
Поскольку, как вы заметили, масштабирование изображений одно за другим является ручным (и, следовательно, утомительным), я предлагаю масштабирование на стороне клиента.
Чтобы сделать это, вам, вероятно, придется написать свой собственный код для кеширования. Я уже делал это раньше, и могу засвидетельствовать, что на самом деле довольно просто получить что-то, что соответствует вашим потребностям. Например, когда мне приходилось кэшировать изображения, я заканчивал тем, что создал словарь, в котором хранятся изображения с URL-ключами. Прежде чем сохранять изображения в словаре, вы уменьшаете их.
В соответствии с просьбой, вот пример кода, чтобы помочь вам. Это не весь код, но это очень прочная основа.
Загрузка изображения
использование Alamofire
чтобы загрузить изображение с URL:
Alamofire.request(.GET, "https://robohash.org/123.png").response { (request, response, data, error) in
self.myImageView.image = UIImage(data: data, scale:1)
}
Масштабирование изображения
Используйте код из этого ответа на SO. Вы должны масштабировать до нужного вам размера изображения и не более.
Хранение изображения
Давайте вернемся немного назад. Я хотел бы, чтобы весь этот код управлялся классом, ImageManager
, или что-то типа того.
ImageManager
должен иметь:
var delegate: ImageManagerDelegate? // the delegate; more detail below
private(set) var images: [URL: UIImage] = [:] // the cache
func getImage(from url: URL) // the entry point to the class; calls the delegate immediately if the image is already cached, else calls `downloadImage(url: url)`
private func downloadImage(url: URL) // actually downloads the image; calls `cacheImage(url: url, image: downloadedImage)`
private func cacheImage(url: URL, image: UIImage) // caches the image in `images` with `url` as the key, and notifies `delegate` that an image has been cached with the specified url.
ImageManager
следует также реализовать ImageManagerDelegate
:
protocol ImageManagerDelegate {
func imageManager(_ manager: ImageManager, didGet image: UIImage, from url: URL)
}