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)
}
Другие вопросы по тегам